EventBus是什么?
simplifies the communication between components decouples event senders and receivers performs well with Activities, Fragments, and background threads avoids complex and error-prone dependencies and life cycle issues
大概意思就是 基于观察者模式的使用,通过模块化解耦方式进行数据化传递。
Eventbus好用之处在于体积轻便,只有50k左右,而且模块化数据传递解耦,并且可以设置实现所处的线程,也可以发送粘性事件来提前缓存事件
使用EventBus
通过引用gradle依赖,目前最新3.1.1 20k star
implementation 'org.greenrobot:eventbus:3.1.1'
使用EventBus配置
EventBusBuilder用于设置EventBus的Config信息。比如设置EventBus,防止发送的事件没有订阅者:
EventBus eventBus = EventBus.builder()
.logNoSubscriberMessages(false)
.sendNoSubscriberEvent(false).build();
另一个例子是失败时订阅者抛出异常。注意,EventBus 默认是捕获onEvent方法抛出的异常并且会发送一个可能没有被处理的事件
EventBus eventBus = EventBus.builder().throwSubscriberException(true).build();
1.发送数据
EventBus.getDefault().post(Obj);//根据传递的类型发送实体数据、如果传递相同实体类数据到其他地方,需要设置标记
2.接收方需要注册
EventBus.getDefault().register(this);
3.声明一个公共方法接收实体类
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(Obj event) {
Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();
}
Obj如果传递到多个地方需要设置标记,根据标记判断
获取数据不仅需要订阅还需要申明注解Subscribe、必须申明线程模式
threadMode
比如Mian(主线程)
Async(由线程池控制、一般都是长时间耗时操作)
background(子线程执行,如果发布是子线程就在发布方线程)
postThread(发送方的线程,如果发送是主线程就不能执行耗时)
可以设置优先级和是否粘性
4.粘性事件(发送数据可以暂时不提供观察者、而是存储起来等到需要接收时申请订阅来得到数据)
EventBus.getDefault().postSticky(Obj);
EventBus.getDefault().registerSticky(this);//注册
EventBus.getDefault().unregister(this);//取消注册
我们也可以来获取指定类型的sticky事件
EventBus.getDefault().getStickyEvent(Class<?> eventType)
防止混淆ProGuard
-keepattributes *Annotation*
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
!# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}
网友评论