2013-05-17 58 views
11

我刚刚开始在Android上查看GreenRobot的EventBus,并且有关于线程的问题。使用GreenRobot EventBus执行线程事件

我有一个长期运行的过程,我想在后台线程上运行,完成后更新UI。

因此,像:

public void onEventBackgroundThread(MyEvent event) { 
     doSomeLongRunningProcess(); 
     updateUI(); 
    } 

显然updateUI()不能在这里叫,因为它也将在后台运行。

那么建议如何处理呢?从我的onEventBackgroundThread()内部发起将在UI线程上运行的另一个事件?或者从长时间运行的过程中解放它?还是有更好的模式?

回答

21

当你得到结果时,我可能会触发另一个事件。

public void onEventBackgroundThread(MyEvent event) { 
    doSomeLongRunningProcess(); 
    EventBus.getDefault().post(new MyEventResult()); 
} 

要知道,虽然reading the docs,你会发现这一点:

BackgroundThread:用户会在后台线程调用。如果 发布线程不是主线程,则会直接在发布线程中调用事件处理程序方法 。如果发布线程为 主线程,则EventBus使用单个后台线程, 将按顺序发送其所有事件。使用此模式的事件处理程序 应尽快返回以避免阻塞后台线程。

如果您在此方法中花费很长时间,其他EventBus回调将被延迟,这可能会转化为无响应的应用程序。

你可能想使用onEventAsync:

异步:事件处理方法被调用在一个单独的线程。这是 总是独立于发布线程和主线程。 发布事件永远不会等待使用此模式的事件处理程序方法。 如果事件处理程序的执行可能需要一段时间(例如 ),则应使用此模式。用于网络访问。避免在同一时间触发大量的长时间运行异步处理程序方法 来限制并发线程的数量。 EventBus使用线程池 高效地重用来自完成的异步事件处理程序 通知的线程。

+0

谢谢佩德罗。并感谢您关于onEventAsync的建议。 – jFort

3

我建议射击另一个事件,将由onEventMainThread方法处理。

如果接收方已经被注销(例如活动未注册,因为它已被销毁),这将对updateUI没有被调用产生积极影响。

相关问题