TheadMode
每一个事件处理方法都有着自己的线程模式(TheadMode)。线程模式决定了EventBus在哪个线程中调用事件处理方法。
ThreadMode枚举包含四个值:
- PostThread
- MainThread
- BackgroundThread
- Async
A.PostThread(默认模式)
调用线程:事件发布线程
当订阅者所关注的变化发生时,EventBus将会在事件所发布的线程中调用订阅者对应的方法。
因为订阅者在发布事件的线程中被调用,所以这种线程模式可以完全避免线程切换所带来的开销。适用于短时间能够完成并且不限定在主线程的事件处理情景。任何事件处理情景使用这种模式必须保证能够快速地返回结果,否者可能将引起线程阻塞。当发布事件的线程是主线程时,还可能会出现ANR。
B.MainThread
调用线程:Android主线程(UI线程)
无论发布事件的是哪个线程,订阅者都将在Android主线程(也即UI线程)中被调用。
任何事件处理场景使用这种模式必须保证快速地返回结果,从而避免阻塞主线程。
C.BackgroundThread
调用线程:事件发布线程或者后台线程
当发布事件的线程不是主线程时,事件处理方法将会立即在该线程中被调用;如果发布时间的线程是主线程,EventBus会使用一个单例的后台线程调用事件处理函数,该后台线程将会按照时间顺序处理并交付所有的事件。
任何事件处理场景使用这种模式必须保证快速地返回结果,从而避免阻塞线程。
D.Async
调用线程:异步线程
事件处理方法将会在异步的线程中被调用。该异步线程既不是主线程,也不是事件发布线程。
在该模式下,发布事件不必等待事件处理方法执行完毕。在事件处理方法执行诸如网络请求等需要花费一定时间的任务时,推荐使用该模式。在使用过程中为了限制并发线程的数量,尽量避免在同一时间段内触发过多需要长时间执行的异步处理方法。
EventBus使用线程池来有效地重用异步线程。