前置知识
- EventBus的基本使用 :探索Android开源框架 - 5. EventBus使用及源码解析 (qq.com)
- 使用注解器 :秒懂Android注解处理器(Android Annotation Processor) - ShuSheng007
- 会自己定义Application
封装过程
封装该库到自己的项目的目的有两个
- 便捷绑定和解绑 EventBus
- 便捷通过 EventBus 发送消息和处理消息
- 代码美观
基于上面的目的,我们可以利用 注解
、编写 工具类
、封装到基类
和 抽象消息类
来实现
依赖引入
我们先引入对应的依赖
//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
工具类即可