一. 前言
EventBus 是一个基于观察者模式的事件订阅/发布框架,利用 EventBus 可以在不同模块之间,实现低耦合的消息通信。
EventBus 因为其使用简单且稳定,被广泛应用在一些生产项目中。
通常我们就是使用 EventBus 分发一些消息给消息的订阅者,除此之外我们还可以通过 EventBus 将消息传递到不同的线程中去执行,处理消息。这其中还涉及到一些线程切换问题、线程池的问题,在使用的过程中,还有一些配置的选择,此时我们需要根据不同的业务场景,来选择不同的线程切换方式。
本文就 EventBus 的几种线程切换方式,以及内部的实现原来,来分析如何使用 EventBus 来切换消息线程。
二. EventBus 的线程切换
2.1 EventBus 切换线程
EventBus 是一个基于观察者模式的事件订阅/发布框架。利用 EventBus 可以在不同模块之间,实现低耦合的消息通信。
EventBus 诞生以来这么多年,在很多生产项目中都可以看到它的身影。而从更新日志可以看到,除了体积小,它还很稳定,这两年就没更新过,最后一次更新也只是因为支持所有的 JVM,让其使用范围不仅仅局限在 Android 上。
可谓是非常的稳定,稳定到让人有一种感觉,要是你使用 EventBus 出现了什么问题,那一定是你使用的方式不对。
EventBus 的使用方式,对于 Android 老司机来说,必然是不陌生的,相关资料太多,这里就不再赘述了。
在 Android 下,线程的切换是一个很常用而且很必须的操作,EventBus 除了可以订阅和发送消息之外,它还可以指定接受消息处理消息的线程。
也就是说,无论你 post()
消息时处在什么线程中,EventBus 都可以将消息分发到你指定的线程上去,听上去就感觉非常的方便。
不过无论怎么切换,无外乎几种情况:
- UI 线程切子线程。
- 子线程切 UI 线程。
- 子线程切其他子线程。
在我们使用 EventBus 注册消息的时候,可以通过 @Subscribe
注解来完成注册事件, @Subscribe
中可以通过参数 threadMode
来指定使用那个线程来接收消息。
@Subscribe(threadMode = ThreadMode.MAIN)
fun onEventTest(event:TestEvent){
// 处理事件
}
threadMode
是一个 enum,有多种模式可供选择:
- POSTING,默认值,那个线程发就是那个线程收。
- MAIN,切换至主线程接收事件。
- MAIN_ORDERED,v3.1.1 中新增的属性,也是切换至主线程接收事件,但是和 MAIN 有些许区别,后面详细讲。
- BACKGROUND,确保在子线程中接收事件。细节就是,