Android 中 EventBus 的使用之多线程事件处理

2019-12-10 19:54:15王振洲

onEventMainThread(T event):运行在主(UI)线程中,不管事件从哪个线程中被发送过来。

onEventAsync(T event):运行在单独的线程中,即非UI线程,也非发送事件的线程。

onEventBackgroundThread(T event):如果发送事件的线程不是UI线程,则运行在该线程中。如果发送事件的是UI线程,则它运行在由EventBus维护的一个单独的线程中。多个事件会同步地被这个单独的后台线程所处理。

这些方法功能强大而且使用简单。例如有一个比较耗时的操作(可能是网络调用,大量数据处理等),这一操作需要由UI上的行为来触发,并且当操作执行完毕后还需对UI进行更新。在这个例子中,UI行为即按钮点击,按钮在activity中,耗时操作在service中。我们可以按下面的方式来实现:

Java

尽管这个例子比较简单,但它却非常简明扼要地说明了问题。这里即不需要实现监听接口,也不会出现类似生命周期之类的问题(由于activity只能在它存在的时候才能接收到OperationCompleteEvent事件)。除此之外,如果发生了配置改变(旋转屏幕)或其他什么原因导致activity在两次事件发生之间被销毁并重建,最终仍可以接收到OperationCompleteEvent事件。

此外,我们也可以容易地想到一些其它用法。比如,如果需要将更新进度发出去,你只需另外实现一个封装了进度值的事件类,然后将其发送出去即可。或者,如果你想让其它一些事件(不管是相同还是不同类型)不被并行处理(同步执行),你可以选择使用onEventBackgroundThread。

依赖Bus

实例化EventBus最简单的方法就是通过EventBus.getDefault()。然而,在EventBusBuilder类(通过EventBus.builder()获得)中还包含了另外一些有用的配置方法。特别是在本文中提到过的使用你自己的ExecutorService。缺省情况下EventBus通过Executors.newCachedThreadPool()创建自己的ExecutorService,在大多数情况下都已满足你的需要。然而,有时你可能仍然想要显示地控制EventBus所使用的线程数量,这种情况下你就可以象下面这样初始化EventBus:

Java

 

 
  1. EventBus.builder().executorService(Executors.newFixedTheadPool(NUM_THREADS)).installDefaultEventBus();