EventBus详解
对于跨线程通信,EventBus在众多开源项目中,算是用的比较多的了,所以我们也不能只是停留在使用的基础上,下面我们来看看EvenBus的实现机制,它是怎么实现跨线程通信的。
1. 框架原理
2. 使用
2.1 定义一个事件:
public static class MessageEvent { /* Additional fields if needed */ }
2.2 在Activity中注册和取消注册:
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
接收对应的消息:
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {/* Do something */};
2.3 发送消息
EventBus.getDefault().post(new MessageEvent());
2.4 gradle接入
implementation 'org.greenrobot:eventbus:3.1.1'
3. 源码解析
3.1 @Subscribe注解
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Subscribe {
ThreadMode threadMode() default ThreadMode.POSTING;
/**
* If true, delivers the most recent sticky event (posted with
* {@link EventBus#postSticky(Object)}) to this subscriber (if event available).
*/
boolean sticky() default false;
/** Subscriber priority to influence the order of event delivery.
* Within the same delivery thread ({@link ThreadMode}), higher priority subscribers will receive events before
* others with a lower priority. The default priority is 0. Note: the priority does *NOT* affect the order of
* delivery among subscribers with different {@link ThreadMode}s! */
int priority() default 0;
}
从Subscribe注解中的元注解可以看出来,我们的Subscribe是运行时注册,只能在运行时进行解析,也只能注册Method方法。
里面有三个参数可以进行配置:
threadMode: 配置消息接收是在哪个线程
有5种设置方式:
POSTING : 消息的接收与消息发送在同一个线程处理
MAIN : 消息在UI线程处理,但是如果发送线程是在UI线程,消息将会直接被调用处理,将阻塞调用线程。
MAIN_ORDERED : 消息在主线程处理,但是跟MAIN不一样的是,消息将会加入到队列中进行处理,不回堵塞调用线程。
BACKGROUND : 消息在后台线程处理,如果发送线程不是UI线程,则将会直接在发送线程处理消息。如果发送线程是UI线程,那么将使用一个后台线程,按照事件顺序处理。
ASYNC :消息将在单独的线程中调用,如果消息处理很耗时,可以采用这种方法,最终是EventBus使用线程池来处理消息。
sticky : 粘性事件,跟粘性广播类似
调用时,需用使用postSticky方法,接收方法添加sticky = true即可,例如:
@Subscribe(threadMode = ThreadMode.Main, sticky = true)
3.2 注解解析
3.3 注册流程解析
3.4 消息发送解析
3.5 消息接收解析
上一篇: EventBus 原理简析