android EventBus使用 總結

以下由我網上看的文章根據自己理解整理而成,感謝以下文章作者
Hongyang
http://blog.csdn.net/lmj623565791/article/details/40794879
啓艦
http://blog.csdn.net/harvic880925/article/details/40787203

github地址:https://github.com/greenrobot/EventBus

EventBus簡介:

EventBus定義:一款針對Android優化的發佈/訂閱事件總線。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,線程之間傳遞消息.優點是開銷小,代碼更優雅。以及將發送者和接收者解耦。
四個部分:

  1. 發佈者(消息發送者)
  2. 訂閱者(註冊EventBus)
  3. 事件(消息接收)
  4. 總線(註銷EventBus)

A activity 跳轉到B activity 過後,B activity 發送消息給A activity ,在A activity 裏面註冊EventBus,註銷BevenBus,接受消息 ,整個過程就是這樣的

   EventBus.getDefault().post("消息");//發送----->>B activity 裏面

  EventBus.getDefault().register(this);//註冊------->>A activity OnCreate()方法
  EventBus.getDefault().unregister(this);//註銷-------->>A activity OnDestroy()方法
    接受消息的方法有四個 依次是:

    onEvent()
    onEventMainThread()
    onEventBackgroundThread()
    onEventAsync()
EventBus四個不同的消息接收處理方法:

onEvent:
使用onEvent,那麼該事件在哪個線程發佈出來的,onEvent就會在這個線程中運行,也就是說發佈事件和接收事件線程在同一個線程。使用這個方法時,在onEvent方法中不能執行耗時操作,如果執行耗時操作容易導致事件分發延遲。

onEventMainThread:
使用onEventMainThread,那麼不論事件是在哪個線程中發佈出來的,onEventMainThread都會在UI線程中執行,接收事件就會在UI線程中運行,這個在Android中是非常有用的,因爲在Android中只能在UI線程中跟新UI,所以在onEvnetMainThread方法中是不能執行耗時操作的。

onEventBackground:
使用onEventBackgrond,那麼如果事件是在UI線程中發佈出來的,那麼onEventBackground就會在子線程中運行,如果事件本來就是子線程中發佈出來的,那麼onEventBackground函數直接在該子線程中執行。

onEventAsync:
使用onEventAsync,那麼無論事件在哪個線程發佈,都會創建新的子線程在執行onEventAsync.

一 、註冊

在要接收消息的頁面註冊EventBus:
通過我們會在OnCreate()函數中註冊EventBus,在OnDestroy()函數中反註冊。所以整體的註冊與反註冊的代碼如下:

  EventBus.getDefault().register(this);//訂閱事件OnCreate()函數

  EventBus.getDefault().unregister(this);//註銷事件OnDestroy()函數

聲明一個類,通過這個類可以發送消息和接收消息的,(實體)

發送的消息我們發個Msg :FirstEvent("Hello EventsBus")


public class FirstEvent {

    String Msg;
    public  FirstEvent(String msg){

        this.Msg=msg;
    }

    public String getMsg() {
        return Msg;
    }

    public void setMsg(String msg) {
        Msg = msg;
    }
}

二、發送

這裏直接點擊按鈕發送過去

 btn2.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                EventBus.getDefault().post(
                        new FirstEvent("FirstEvent btn clicked"));
            }
        });

//接收函數1

   public void onEventMainThread(FirstEvent event) {

        String msg = "onEventMainThread收到了消息:" + event.getMsg();
        Log.i("msg", msg);
        Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
    }

這裏的EventsBus 消息的發送和接受有個非常經典的總結:

當發送EventsBus 實例的消息過來的時候,消息的接收是根據參數中的類名來執行的

當然現在的EventBus 到了3.0 了 ,其實大體還是一樣的,只不過多了幾個註解而已

三、注意事項

  1、註冊一般寫在onCreate或者onStart中,儘量不要寫在onResume,可能出現多次註冊,比如:
  

    //EventBusException: Subscriber class already registered to event class

  
  2、取消註冊一定寫在onDestory,寫在onStop可能會引發異常;
  
  
  3、建議註冊前先判斷一下是否已經註冊,避免重複註冊,並且註冊儘量放在各變量初始化最後,以免造成空指針異常;

    if (!EventBus.getDefault().isRegistered(this)) {
               EventBus.getDefault().register(this);
        }

  4、3.0和之前版本不兼容,現在採用註解的方法來接收事件,四種註解方式分別爲:

    1)  @Subscrible  對應之前的onEvent();
    2)  @Subscrible(threadMode = ThreadMode.ASYNC) 對應之前的onEventAsync();
    3)  @Subscrible(threadMode = ThreadMode.BACKGRAND) 對應之前的onEventBackground();
    4)  @Subscrible(threadMode = ThreadMode.MAIN) 對應之前的onEventMainThread();

如:

@Subscribe(threadMode = ThreadMode.MAIN)
     public void onEventMainThread(MessageEvent event) {
       //更新UI...
   }

  5、採用註解後方法名沒有限制了,參數只有一個,和發送者post的參數對應配對,未聲明threadMode的時候默認線程模式是ThreadMode.POSTING,只有在該模式下才可以取消線程,否則容易導致如下異常:org.greenrobot.eventbus.EventBusException: This method may only be called from inside event handling methods on the posting thread

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章