</div>
</div>
現在Event Bus會把所有的LocationChangedEvent 事件都發送給上面的函數。MmLocationManager 類不用注冊監聽器了,當位置改變的時候 只需要向Event Bus發布事件即可:
bus.post(new LocationChangedEvent(37.892818, -121.772608));
這樣 組件間相互解耦了,而單元測試也變得簡單了。任何事件都可以發布給Event Bus,然后Event Bus會找到對該事件感興趣的函數來調用。
注意:您也許已經發現該模式在Android上層也存在 — Intent系統就是這樣設計的!
Android系統的Event Bus模式類庫
1、Otto — Android系統的Event Bus類庫
Otto是Square公司在他們應用中使用的Event Bus實現。從Guava中演變而來,并且專注于Android平臺。
通過使用Otto,Square公司的應用組件間不緊密耦合了,單元測試也更加容易了。
Otto項目的主頁:http://square.github.io/otto/
Otto項目GitHub地址:https://github.com/square/otto
2、EventBus — Android系統的Event Bus類庫
EventBus 是http://greenrobot.de 出品的另外一個Event Bus類庫,功能稍微多一點。
EventBus 項目地址:https://github.com/greenrobot/EventBus
關于兩者的對比可以參考EventBus 項目Comparison with Square's Otto部分: https://github.com/greenrobot/EventBus#comparison-with-squares-otto
EventBus介紹
EventBus可以向不同的線程中發布事件,在ThreadMode 枚舉中定義了4個線程,只需要在事件響應函數名稱“onEvent”后面添加對應的線程類型名稱,則還事件響應函數就會在對應的線程中執行,比如事件函數 “onEventAsync”就會在另外一個異步線程中執行,ThreadMode定義的4個線程類型如下:
PostThread:事件響應函數和事件發布在同一線程中執行。這個是默認值,這樣可以避免線程切換。
MainThread:事件響應函數會在Android應用的主線程(大部分情況下都是UI線程)中執行。
BackgroundThread:事件響應函數會在一個后臺線程中執行。如果事件發布函數不是在主線程中,則會立即在事件發布線程中執行響應函數。如果事件發布函數在主線程中,EventBus則會在唯一的一個后臺線程中按照順序來執行所有的后臺事件響應函數。
上面的3種事件響應函數,應該能夠很快的執行完,不然的話會阻塞各自的事件發布。
async:事件響應函數在另外一個異步線程中執行。該線程和發布線程、主線程相互獨立。如果事件響應函數需要較長的時間來執行,則應該使用該模式,例如 網絡訪問等。需要注意的是,由于系統并行的限制,應該避免在同一時間觸發大量的異步線程。
在Android中我們可以在onCreate方法中調用EventBus的register(Object subscriber) 注冊訂閱者:
</div>
</div>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findView();
EventBus.getDefault().register(this);
} </pre><br />
調用EventBus的unregister(Object subscriber) 方法 取消注冊的訂閱者:
</div>
</div>
@Override
protected void onDestroy() {
super.onDestroy();
try {
EventBus.getDefault().unregister(this);
} catch (Throwable t){
//this may crash if registration did not go through. just be safe
}
}
調用EventBus的post(Object event) 方法 post消息到Bus上,本例是在一個子線程中post一個消息到UI線程:
</div>
</div>
@Override
public void onRun() throws Throwable {
// TODO Auto-generated method stub
Log.e(TAG, "onRun sleep 6s");
Thread.sleep(6000);
EventBus.getDefault().post(new PostedCityEvent("posted"));
}
在訂閱者中實現的 EventBus 上的事件處理方法,本例是在Activity中進行處理的:
本文由用戶
jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
sesese色