这是我参与「第四届青训营 」笔记创作活动的的第9天
前置知识
- 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
工具类即可
参考
EventBus索引加速探究_RikkaTheWorld的博客-CSDN博客