我已經實現了一個服務,在該服務中,我處理狀態更改(連接,斷開連接,onServiceDiscoverd,onCharacteristicChange等)並通過gatt服務器從另一個設備接收數據。用Greenrobot Eventbus替換廣播接收機是否很好用於觸發基於事件的功能和數據從服務轉移到活動?
我的問題是,能否事件使用Greenrobot Eventbus更換服務和活動之間的廣播接收器有效地處理?
我已經實現了一個服務,在該服務中,我處理狀態更改(連接,斷開連接,onServiceDiscoverd,onCharacteristicChange等)並通過gatt服務器從另一個設備接收數據。用Greenrobot Eventbus替換廣播接收機是否很好用於觸發基於事件的功能和數據從服務轉移到活動?
我的問題是,能否事件使用Greenrobot Eventbus更換服務和活動之間的廣播接收器有效地處理?
不同於LocalBroadcastManager, EventBus使用起來更簡單。你只能通過3個步驟:
1-創建一個事件類。一個簡單的Java類,表示發生操作時的響應。
2-註冊事件總線作爲在活動訂戶onCreate方法
EventBus.getDefault().register(this);
當然而且,註銷在你的活動的onDestroy方法
EventBus.getDefault().unregister(this);
3-已創建訂閱方法在爲EventBus註冊的相同活動中。在WorkOrderActivity
@Subscribe
public void onEvent(EventClass event)
當事件發生的例子,你應該調用POST方法,傳遞你之前創建的事件對象。
EventBus.getDefault().post(new EventClass (Data));
正如kmaini提到的,你可以用LocalBroadcastManager取代它,但是你必須自己從意圖的數據映射。不像可以傳遞對象的EventBus。
此外,greenrobot,EventBus庫的創造者,回答了這個問題here:
問:如何是EventBus不同的Android的廣播接收器/意圖 系統?答:與Android的BroadcastReceiver/Intent系統不同,EventBus使用 標準Java類作爲事件,並提供更方便的API。 EventBus用於許多更多的用例,您不會想要通過設置Intents,準備Intent 臨時演員,實現廣播接收器以及再次提取Intent extras的麻煩。此外,EventBus的開銷更低。
這裏是我遵循了實施LocalBroadcast鏈接:
https://stackoverflow.com/a/8875292/4406743
這是我實現的總結:
在接收活動或服務:
1)註冊爲本地braodcast(通常在onCreate):
LocalBroadcastManager.getInstance(this).registerReceiver(
mMessageReceiver, new IntentFilter("broacast_name"));
2)取消註冊爲本地broadast(通常的onDestroy):
LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
3)定義的廣播接收機:
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//Handle local broadcast
}
};
在發送的活動或服務:
Intent it = new Intent("broacast_name");
it.putExtra("data", "value");
LocalBroadcastManager.getInstance(context).sendBroadcast(it);
事件總線是很好的lib。它使編碼非常簡單並且解耦。繼續使用它。 –
EventBus使事情變得更容易,因爲你可以是沿event.You任意的Java對象不是做同樣的Intents
,因爲你的目標必須實現Parcelable
和「乏味」 parcelable實現這些你可能而不是在現有的代碼庫上做什麼。
從另一個角度來說,我認爲Android中的廣播管理器使用主線程處理程序的消息隊列來處理事件。因此,如果您可以自由使用不同的線程(如果您沒有UI事件/作業/任務)並且擁有適當的隊列(如使用另一個HandlerThread),那麼您可以利用該線程的特定隊列來處理作業,而不會干擾用戶界面事件並將您的內容與用戶界面工作混合您也可以玩線程的優先級值來平衡工作。
現在,如果GreenRobot在幾行代碼中提供了所有的功能,那麼我肯定會試試看它的性能增益。
我沒有使用Greenrobot Eventbut,所以我不能對此發表評論。但一般情況下,如果通信在同一進程的活動和服務之間,最好使用LocalBroadcastManager而不是BroadcastReceiver。 – kmaini
@kmaini有沒有您遇到過的任何示例或鏈接對您非常有用? –