EventBus使用介紹


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參數列表一致,則都會調用,而且優先級越高則越在前面被調用到。

 

點擊此處下載demo

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM