EventBus封装到项目架构|青训营笔记

简介: 封装该库到自己的项目的目的有两个便捷绑定和解绑 EventBus便捷通过 EventBus 发送消息和处理消息代码美观

前置知识

封装过程

封装该库到自己的项目的目的有两个

  1. 便捷绑定和解绑 EventBus
  2. 便捷通过 EventBus 发送消息和处理消息
  3. 代码美观

基于上面的目的,我们可以利用 注解 、编写 工具类封装到基类抽象消息类 来实现

依赖引入

我们先引入对应的依赖

//build.gradle(:app)
defaultConfig {
    ...
    javaCompileOptions {
        annotationProcessorOptions {
            //此处路径填写自己的包名+类名
            arguments = [ eventBusIndex : 'com.qxy.potato.MyEventBusIndex' ]
        }
    }
    ...
}
dependencies {
    ...
    //eventBus
    def eventbus_version = '3.2.0'
    implementation "org.greenrobot:eventbus:$eventbus_version"
    annotationProcessor "org.greenrobot:eventbus-annotation-processor:$eventbus_version"
}
复制代码

上面引入了 EventBus的注解器,该注解器可以帮忙生成 索引,大幅度提高EventBus的使用效率

1.webp.jpg

由上图可知,使用了注解可以利用索引的 EventBus ,效率是可以大幅度提升的,所以我们是很有必要去利用EventBus的索引类

使用索引的时候,我们需要注意如下点

索引要求

  • @Subscribe方法及其类必须是公共的
  • 事件类必须是公共的
  • @Subscribe不能****在匿名类内部使用。

注意: 当 EventBus 无法使用索引时,例如,如果不满足上述要求,它将在运行时回退到反射。这可确保@Subscribe方法接收事件,即使它们不是索引的一部分。

Translate from Subscriber Index - Open Source by greenrobot

编写工具类

public class EventBusUtil {
    /**
     * 发送消息(事件)
     * @param event
     */
    public static void sendEvent(BaseEvent<?> event){
        EventBus.getDefault().post(event);
    }
    /**
     * 发送 粘性 事件
     *
     * 粘性事件,在注册之前便把事件发生出去,等到注册之后便会收到最近发送的粘性事件(必须匹配)
     * 注意:只会接收到最近发送的一次粘性事件,之前的会接受不到。
     * @param event
     */
    public static void sendStickyEvent(BaseEvent<?> event){
        EventBus.getDefault().postSticky(event);
    }
}
复制代码

编写注解类

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface BindEventBus {
}
复制代码

Base封装

public class BaseEvent<T> {
    private int eventCode;
    private T data;
    public BaseEvent(int eventCode, T data) {
        this.eventCode = eventCode;
        this.data = data;
    }
    public int getEventCode() {
        return eventCode;
    }
    public void setEventCode(int eventCode) {
        this.eventCode = eventCode;
    }
    public T getData() {
        return data;
    }
    public void setData(T data) {
        this.data = data;
    }
}
复制代码
//Fragment也是类似
public abstract class BaseActivity{
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(this.getClass().isAnnotationPresent(BindEventBus.class)){
            EventBus.getDefault().register(this);
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(this.getClass().isAnnotationPresent(BindEventBus.class)){
            EventBus.getDefault().unregister(this);
        }
    }
}
复制代码

生成索引类

@BindEventBus
public class MainActivity extends BaseActivity{
    /**
     * 载入view的一些操作
     */
    @Override
    protected void initView() {
        PictureGirl girl = new PictureGirl();
        BaseEvent<PictureGirl> ev = new BaseEvent<>(1,girl);
        EventBusUtil.sendEvent(ev);
    }
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMainActivityEvent(BaseEvent event){
    }
}
复制代码

我们在需要使用到EventBus的对应继承类处添加 @BindEventBus 注解,先实现一个空的事件发送和接收。然后点击 AS 的 build->Rebuild Project,对项目进行编译。

编译结束后,我们可以可以在buid类中找到 MyEventBusIndex

1.webp.jpg

声明添加索引

public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        //使用订阅索引,加快编译速度
        EventBus.builder().addIndex(new MyEventBusIndex()).installDefaultEventBus();
    }
}
复制代码

使用

惨遭上文 生成索引类处的使用,在对应继承类中加入注解,发送消息时候使用 EventBusUtil 工具类即可



相关文章
|
2月前
|
设计模式 前端开发 测试技术
Flutter 项目架构技术指南
探讨Flutter项目代码组织架构的关键方面和建议。了解设计原则SOLID、Clean Architecture,以及架构模式MVC、MVP、MVVM,如何有机结合使用,打造优秀的应用架构。
Flutter 项目架构技术指南
|
3月前
|
监控 负载均衡 Dubbo
|
4月前
|
机器学习/深度学习 搜索推荐 算法
深度学习推荐系统架构、Sparrow RecSys项目及深度学习基础知识
深度学习推荐系统架构、Sparrow RecSys项目及深度学习基础知识
|
5月前
|
设计模式 前端开发 Java
KnowStreaming系列教程第二篇——项目整体架构分析
KnowStreaming系列教程第二篇——项目整体架构分析
48 0
|
5月前
|
前端开发 JavaScript Java
电商4.0项目【二】: 架构搭建
电商4.0项目【二】: 架构搭建
43 0
|
2月前
|
SpringCloudAlibaba Java 持续交付
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
190 0
|
5月前
|
前端开发 JavaScript 数据库
Flask狼书笔记 | 09_图片社交网站 - 大型项目的架构与需求(2)
9.8 收藏图片 前面已经学习过如何使用关联表来表示多对多关系,缺点是只能表示关系,不能存储数据(如我还想记录下收藏图片的时间戳)。这种情况下,我们可以使用关联模型来表示多对多关系。 在关联模型中,我们将Photo模型与User模型的多对多关系,分离成了User模型和Collect模型的一对多关系,和Photo模型与Collect模型的一对多关系。
88 0
|
2月前
|
消息中间件 并行计算 网络协议
探秘高效Linux C/C++项目架构:让进程、线程和通信方式助力你的代码飞跃
探秘高效Linux C/C++项目架构:让进程、线程和通信方式助力你的代码飞跃
41 0
|
3月前
|
缓存 监控 安全
如何设计大型项目技术运营服务架构
【2月更文挑战第3天】如何设计大型项目技术运营服务架构
343 1
|
3月前
|
存储 传感器 网络协议
《物联网技术》课程笔记——第二章 物联网技术架构
《物联网技术》课程笔记——第二章 物联网技术架构