EventBus分析

Posted by Jfson on 2018-12-29

EventBus

观察者模式
订阅后,对类,方法进行反射发送消息。并且支持订阅线程可配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
private void postToSubscription(Subscription subscription, Object event, boolean isMainThread) {
switch (subscription.subscriberMethod.threadMode) {
// 订阅线程跟随发布线程
case POSTING:
// 订阅线程和发布线程相同,直接订阅
invokeSubscriber(subscription, event);
break;
// 订阅线程为主线程
case MAIN:
if (isMainThread) {
// 发布线程和订阅线程都是主线程,直接订阅
invokeSubscriber(subscription, event);
} else {
// 发布线程不是主线程,订阅线程切换到主线程订阅
mainThreadPoster.enqueue(subscription, event);
}
break;
// 订阅线程为后台线程
case BACKGROUND:
if (isMainThread) {
// 发布线程为主线程,切换到后台线程订阅
backgroundPoster.enqueue(subscription, event);
} else {
// 发布线程不为主线程,直接订阅
invokeSubscriber(subscription, event);
}
break;
// 订阅线程为异步线程
case ASYNC:
// 使用线程池线程订阅
asyncPoster.enqueue(subscription, event);
break;
default:
throw new IllegalStateException("Unknown thread mode: " + subscription.subscriberMethod.threadMode);
}
}

看到四种线程模式

POSTING:事件发布在什么线程,就在什么线程订阅。
MAIN:无论事件在什么线程发布,都在主线程订阅。
BACKGROUND:如果发布的线程不是主线程,则在该线程订阅,如果是主线程,则使用一个单独的后台线程订阅。
ASYNC:在非主线程和发布线程中订阅。

订阅者四种线程模式的特点对应的就是以上代码,简单来讲就是订阅者指定了在哪个线程订阅事件,无论发布者在哪个线程,它都会将事件发到订阅者指定的线程


pv UV: