EventBus是Android下高效的發布/訂閱事件總線機制。作用是可以代替傳統的Intent,Handler,Broadcast或接口函數在Fragment,Activity,Service,線程之間傳遞數據,執行方法。特點是代碼簡潔,是一種發布訂閱設計模式(Publish/Subsribe),或稱作觀察者設計模式。
下面對EventBus框架使用進行介紹以及一些需要注意的地方。
1.EventBus使用配置。
1)在gradle中添加:compile 'org.greenrobot:eventbus:3.0.0'
2)在需要接受event的類中注冊和結束注冊,如activity中 onCreate方法中使用EventBus.getDefault().register(this);
在onDestory方法中使用 EventBus.getDefault().unregister(this);
3)增加EventModel,如:
public class FirstEventModel { private String msg; public FirstEventModel(String msg){ this.msg = msg; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }
4).在接受Event類中 增加需要處理的方法。處理的方法有四個
四個方法分別為:
---onEvent()://如果使用onEvent作為訂閱函數,那么該事件在哪個線程發布出來的,onEvent就會在這個線程中運行,
也就是說發布事件和接收事件線程在同一個線程。使用這個方法時,在onEvent方法中不能執行耗時操作,
如果執行耗時操作容易導致事件分發延遲。
---onEventMainThread()://如果使用onEventMainThread作為訂閱函數,那么不論事件是在哪個線程中發布出來的,
onEventMainThread都會在UI線程中執行,接收事件就會在UI線程中運行,
這個在Android中是非常有用的,因為在Android中只能在UI線程中跟新UI,
所以在onEvnetMainThread方法中是不能執行耗時操作的。
---onEventBackgroudThread()://如果使用onEventBackgrond作為訂閱函數,那么如果事件是在UI線程中發布出來的,
那么onEventBackground就會在子線程中運行,如果事件本來就是子線程中發布出來的,
那么onEventBackground函數直接在該子線程中執行。
---onEventAsync():
//使用這個函數作為訂閱函數,那么無論事件在哪個線程發布,都會創建新的子線程在執行onEventAsync.
注意:首先上述方式可以使用多態的方式,在回調的時候,eventBu框架會根據參數的不同,通過反射判斷選擇使用哪個方法調用,如果參數一致則多個方法都會被調用。
其次這些方法一定要加上注解: @Subscribe
代碼如下:
@Subscribe public void onEvent(){ //如果使用onEvent作為訂閱函數,那么該事件在哪個線程發布出來的,onEvent就會在這個線程中運行, // 也就是說發布事件和接收事件線程在同一個線程。使用這個方法時,在onEvent方法中不能執行耗時操作, // 如果執行耗時操作容易導致事件分發延遲。 } @Subscribe public void onEventAsync(){ //使用這個函數作為訂閱函數,那么無論事件在哪個線程發布,都會創建新的子線程在執行onEventAsync. } @Subscribe public void onEventBackgroundThread(){ //如果使用onEventBackgrond作為訂閱函數,那么如果事件是在UI線程中發布出來的, // 那么onEventBackground就會在子線程中運行,如果事件本來就是子線程中發布出來的, // 那么onEventBackground函數直接在該子線程中執行。 } @Subscribe public void onEventMainThread(FirstEventModel firsEventModel){ //如果使用onEventMainThread作為訂閱函數,那么不論事件是在哪個線程中發布出來的, // onEventMainThread都會在UI線程中執行,接收事件就會在UI線程中運行, // 這個在Android中是非常有用的,因為在Android中只能在UI線程中跟新UI, // 所以在onEvnetMainThread方法中是不能執行耗時操作的。 activity_main_tv.setText(firsEventModel.getClass().getSimpleName() + ":" +firsEventModel.getMsg() ); } @Subscribe public void onEventMainThread(SecondEventModel secondEventModel){ //如果使用onEventMainThread作為訂閱函數,那么不論事件是在哪個線程中發布出來的, // onEventMainThread都會在UI線程中執行,接收事件就會在UI線程中運行, // 這個在Android中是非常有用的,因為在Android中只能在UI線程中跟新UI, // 所以在onEvnetMainThread方法中是不能執行耗時操作的。 activity_main_tv.setText(secondEventModel.getClass().getSimpleName() + ":" + secondEventModel.getCode()); }
2.從使用體驗上感受EvenBus在處理同一進程下、不同activity、fragment的通信機制上解耦合 是比較好用的,降低了一些開發者對於解耦合處理的難度要求。有一些機制比如:startActivityForResult、廣播、handle等這些可以使用eventBus替代,代碼的維護性會比較高。
3.圖說EventBus
這里發布者是可以有多個的,通過調用post方法,eventbus則通過反射機制根據參數列表判斷調用哪個Subcriber,如果是多個subcriber參數列表一致,則都會調用,而且優先級越高則越在前面被調用到。