简单了解EventBus
本文基于EventBus3.0,本文仅是一篇笔记,如有不对或不足之处,请直接批评指出。
官方参考链接:https://github.com/greenrobot/EventBus
其他参考链接:http://blog.csdn.net/ljd2038/article/details/50866294(文中部分内容摘自此链接)
一、EventBus的使用只需三步
首先我们需要将EventBus添加到我们的项目中。在AndroidStudio中我们可以在moudle的gradle里面直接配置即可。
compile 'org.greenrobot:eventbus:3.0.0'
1.定义events
public static class MessageEvent { /* Additional fields if needed */ }
2.选择指定的线程模式,声明订阅的方法
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {/* Do something */};
绑定和解绑,Android中通常根据生命周期进行绑定和解绑
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EventBus.getDefault().register(this);
}
@Override
public void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
3.发送事件
EventBus.getDefault().post(new MessageEvent());
二、EventBus的四种ThreadMode
1、 ThreadMode: POSTING
哪个线程发布,订阅者就在哪个线程中执行
这个也是EventBus默认的线程模式,由于没有线程的切换,也就意味消耗的资源也是最小的。如果一个任务不需要多线程的,也是推荐使用这种ThreadMode的。
@Subscribe(threadMode = ThreadMode.POSTING)
2、 ThreadMode: MAIN
主线程中运行,这里就不能执行一些耗时的任务
@Subscribe(threadMode = ThreadMode.MAIN)
3、 ThreadMode: BACKGROUND
在后台线程中执行
如果发布者是在主线程中进行的事件发布,那么订阅者将会重新开启一个子线程运行,若是发布者在不是在主线程中进行的事件发布,那么这时候订阅者就在发布者所在的线程中执行任务。
@Subscribe(threadMode = ThreadMode.BACKGROUND)
4、 ThreadMode: ASYNC
在独立的线程中执行
不管发布者是在主线程还是在子线程中进行事件的发布,订阅者都是在重新开启一个线程来执行任务。
@Subscribe(threadMode = ThreadMode.ASYNC)
三、优先级和事件取消
在订阅者中我们可以设置优先级,优先级高的将会首先接收到发布者所发布的事件,并且我们还能在高优先级中取消事件,这时低优先级的订阅者将接收不到事件。这类似于BroadcastReceiver中的取消广播。不过这里有一点我们要注意,对于订阅者的优先级只是针对于相同的ThreadMode中。默认的优先级为0。
四、ProGuard代码混淆
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);
}