EventBus
简介:
* 简化Activitys、Fragments、后台线程间的通信
* 避免复杂的和容易出错的依赖和生命周期,注册与解绑
* 使用代码简单
* 性能高
* 处理事件可以随意指定线程
优点:简化组件之间的通信方式,实现解耦让业务代码更加简洁,可以动态设置事件处理线程以及优先级
缺点:目前发现唯一的缺点就是类似之前策略模式一样的诟病,每个事件都必须自定义一个事件类,造成事件类太多,无形中加大了维护成本
开始使用EventBus
1.EventBus可以从JCenter和Maven中央仓库获取,所以只需在gradle脚本中添加这个依赖
compile 'org.greenrobot:eventbus:3.0.0' 2.定义事件public class MessageEvent { private String message; public MessageEvent(String message) { this.message = message; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
3.注册组件(以Activity为例)//注册事件 EventBus.getDefault().register(this); 一般在onDestroy()中解绑EventBus//取消事件注册 EventBus.getDefault().unregister(this); 4.接收到事件的处理函数/** * Main * 消息处理的方法.在主线程执行函数 * @param messageEvent */ @Subscribe(threadMode = ThreadMode.MAIN) public void onShowMessageEventMain(MessageEvent messageEvent){ tv.setText("Message from SecondActivity : " + messageEvent.getMessage()); Log.e(TAG ,"--接收messgae:" + messageEvent.getMessage()); Log.e(TAG ,"--MAIN执行函数所在线程:" + Thread.currentThread().getName()); } /** * Post * 发送事件在哪个线程,就在哪个线程执行函数 * @param messageEvent */ @Subscribe(threadMode = ThreadMode.POSTING) public void onShowMessageEventPost(MessageEvent messageEvent){ Log.e(TAG ,"--接收messgae:" + messageEvent.getMessage()); Log.e(TAG ,"--POSTING执行函数所在线程:" + Thread.currentThread().getName()); } /** * Astn * 发送事件不管在什么进程,都会新建线程执行函数 * @param messageEvent */ @Subscribe(threadMode = ThreadMode.ASYNC) public void onShowMessageEventAsyn(MessageEvent messageEvent){ Log.e(TAG ,"--接收messgae:" + messageEvent.getMessage()); Log.e(TAG ,"--ASYNC执行函数所在线程:" + Thread.currentThread().getName()); } /** * Background * 发送事件在UI线程的话,就会新建线程执行函数,发送事件在子线程的话,就在该子线程中执行函数 * @param messageEvent */ @Subscribe(threadMode = ThreadMode.BACKGROUND) public void onShowMessageEventBackground(MessageEvent messageEvent){ Log.e(TAG ,"--接收messgae:" + messageEvent.getMessage()); Log.e(TAG ,"--BACKGROUND执行函数所在线程:" + Thread.currentThread().getName()); }
5.发送事件
EventBus.getDefault().post(new MessageEvent(edit.getText().toString()));
事件有一般事件和粘性事件,组件A 和 B ,A注册了事件,并有事件处理函数,但是未指定是粘性函数处理,B中有指定为粘性事件执行的函数;此时B通过postSticky()发送粘性事件,此时会执行A中的处理函数,B因为还没有注册,不会执行粘性函数,点击将B注册事件,此时就会执行B中的粘性事件。假设还有组件C,一旦组件C也注册事件,此时C中的粘性事件的处理函数也会执行,也就说发送的这一个粘性事件,只要有新注册的粘性函数就会执行 ,标明是否是粘性函数的标记:sticky=true。EventBus.getDefault().postSticky(new MessageEvent(edit.getText().toString()));//如果此组件注册为粘性事件,就会发送粘性事件,如果未注册粘性事件就会发送一般的事件
//下面是黏性事件 @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) public void onShowMessageEventMainSticky(MessageEvent messageEvent) { Log.e(TAG, "--接收messgae:" + messageEvent.getMessage()); Log.e(TAG, "--MAIN执行函数所在线程--黏性事件:" + Thread.currentThread().getName()); } @Subscribe(threadMode = ThreadMode.POSTING, sticky = true) public void onShowMessageEventPostSticky(MessageEvent messageEvent) { Log.e(TAG, "--接收messgae:" + messageEvent.getMessage()); Log.e(TAG, "--POSTING执行函数所在线程--黏性事件:" + Thread.currentThread().getName()); } @Subscribe(threadMode = ThreadMode.ASYNC, sticky = true) public void onShowMessageEventAsynSticky(MessageEvent messageEvent) { Log.e(TAG, "--接收messgae:" + messageEvent.getMessage()); Log.e(TAG, "--ASYNC执行函数所在线程--黏性事件:" + Thread.currentThread().getName()); } @Subscribe(threadMode = ThreadMode.BACKGROUND, sticky = true) public void onShowMessageEventBackgroundSticky(MessageEvent messageEvent) { Log.e(TAG, "--接收messgae:" + messageEvent.getMessage()); Log.e(TAG, "--BACKGROUND执行函数所在线程--黏性事件:" + Thread.currentThread().getName()); }
混淆:
#EventBus混淆 |
-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); |
更详细的可以看源码
源码传送门