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:在非主线程和发布线程中订阅。
订阅者四种线程模式的特点对应的就是以上代码,简单来讲就是订阅者指定了在哪个线程订阅事件,无论发布者在哪个线程,它都会将事件发到订阅者指定的线程