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

144 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的的第9天

前置知识

封装过程

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

  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的使用效率

由上图可知,使用了注解可以利用索引的 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

声明添加索引

public class App extends Application {

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

}

使用

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

参考

EventBus索引加速探究_RikkaTheWorld的博客-CSDN博客

EventBus索引分析 - 简书 (jianshu.com)

订阅者指数 - Greenrobot 的开源

EventBus的优雅封装 - 掘金 (juejin.cn)