欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

EventBus详解

程序员文章站 2022-06-09 23:34:39
...

对于跨线程通信,EventBus在众多开源项目中,算是用的比较多的了,所以我们也不能只是停留在使用的基础上,下面我们来看看EvenBus的实现机制,它是怎么实现跨线程通信的。

1. 框架原理

EventBus详解

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