[英]Threading events using GreenRobot EventBus
我剛剛開始關注GreenRobot的EventBus for Android,並對線程有疑問。
我有一個長期運行的進程,我想在后台線程上運行,當完成后,它會更新UI。
所以類似於:
public void onEventBackgroundThread(MyEvent event) {
doSomeLongRunningProcess();
updateUI();
}
顯然,這里不能調用updateUI()
,因為它也可以在后台運行。
那么推薦的處理方法是什么? 從我的onEventBackgroundThread()
中onEventBackgroundThread()
另一個事件,該事件將在UI線程上運行? 或者從長時間運行的過程中解雇它? 還是有更好的模式?
當你得到結果時,我可能會發射另一個事件。
public void onEventBackgroundThread(MyEvent event) {
doSomeLongRunningProcess();
EventBus.getDefault().post(new MyEventResult());
}
請注意 : 閱讀文檔 ,您會發現:
BackgroundThread :將在后台線程中調用訂閱者。 如果發布線程不是主線程,則將在發布線程中直接調用事件處理程序方法。 如果發布線程是主線程,則EventBus使用單個后台線程,該線程將按順序傳遞其所有事件 。 使用此模式的事件處理程序應嘗試快速返回以避免阻止后台線程。
如果您在此方法中花費很長時間,其他EventBus回調將被延遲,這可能會轉換為無響應的應用程序。
您可能想要使用onEventAsync:
異步 :事件處理程序方法在單獨的線程中調用。 這始終獨立於發布線程和主線程。 發布事件永遠不會等待使用此模式的事件處理程序方法。 如果事件處理程序的執行可能需要一些時間,例如用於網絡訪問,則應使用此模式。 避免同時觸發大量長時間運行的異步處理程序方法來限制並發線程數。 EventBus使用線程池從已完成的異步事件處理程序通知中有效地重用線程。
我建議觸發另一個將由onEventMainThread
方法處理的onEventMainThread
。
如果接收器已經未注冊(例如,因為它被銷毀而未注冊的活動),這會對updateUI
沒有被調用產生積極的影響。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.