简单了解EventBus

2018-03-08  本文已影响5人  被时光移动的城

本文基于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);
}
上一篇 下一篇

猜你喜欢

热点阅读