EventBus 3.0 事件總線

一、什麼是事件總線?

它是針對Android中的四大組件Activity,Service,BroadcastReceiver和ContentProvider之間實現的統一的訂閱、發佈,以實現它們之間的進程通信。其原理是採用了觀察者模式的開發機制。

 

二、常用的事件總線框架

EventBus和Otto

EventBus的基本使用官方參考:https://github.com/greenrobot/EventBus

Otto的基本使用官方參考:http://square.github.io/otto/

 

三、EventBus的使用

1.在build.gradle中添加依賴庫

dependencies {

compile fileTree(include: ['*.jar'], dir: 'libs')
  testCompile 'junit:junit:4.12'
compile 'org.greenrobot:eventbus:3.0.0'
}

2.註冊和反註冊

一般在Activity或者Fragment中的onCreat方法中進行註冊,在onDestroy中進行反註冊。

@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    EventBus.getDefault().register(this);

}

@Override

protected void onDestroy() {

    super.onDestroy();

    EventBus.getDefault().unregister(this);

}

3.訂閱者

類似廣播,但是有別於2.4版本,你不必再去約定OnEvent方法開頭了(看不懂沒關係),在3.0版本之後訂閱者有四種形式(就是四種線程模式)的接收方式:

ThreadMode.MAIN:如果線程模式是MAIN,那麼無論事件是在什麼線程發送出來的,該事件處理函數都會在UI線程中執行,可以用來更新UI,但是注意不要做耗時操作。

ThreadMode.POSTING:如果訂閱者在使用事件處理函數時候指定了這種線程模式,那麼該事件是在哪個線程發佈出來的,那麼處理函數就會在這個線程中執行,也就是說發佈事件和接收事件是在同一個線程。在這種線程模式下儘量避免做耗時操作,因爲會阻塞事件的傳遞,很有可能引起ANR。

ThreadMode.ASYNC:這種線程模式就是說,無論事件在哪個線程發佈,該事件的處理函數都會在新建的子線程中執行,此事件處理函數中是不能進行UI操作的。

ThreadMode.BACKGROUND:這種線程模式意思是,如果事件是在UI線程中發佈出來的,那麼該事件處理函數就會在子線程中執行;如果事件是在子線程中發佈的,那就還在這個線程中處理。在這種模式下是不能更新UI操作的。

個人覺得第一種比較常用,後面三種用的頻率很低。

@Subscribe(threadMode = ThreadMode.MAIN)
public void receiveEventBus(MessageEvent event) {
    Log.v(TAG, "EventBus is running" + event.getMessage());

//在此執行你要進行的操作(更新UI,接收消息等)
}

使用了@Subscribe註解,其含義爲訂閱者,在其內傳入了threadMode,我們定義爲ThreadMode.MainThread, 其含義爲該方法在UI線程完成,這樣你就不要擔心拋出異常啦。receiveEventBus 是一個函數名,你自己可 以任意定義。

4.發佈者

發佈者可以在你程序的任意位置進行發佈,當它執行之後,訂閱者回立即收到消息,並進行處理。

EventBus.getDefault().post(new MessageEvent ());或者EventBus.getDefault().post(new MessageEvent (msg));

由於我們的post可能是一個對象,所以我們需要定義一個class類MessageEvent.java

public class MessageEvent {
    private String msg;
    public PersonEvent() {
    }
    public PersonEvent(String msg) {
        msg = msg;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
}

 

好了,到這裏EventBus事件總線就完成了,趕快去嘗試一下能否正常運行吧!

如果您覺得對你有用,請幫我頂一頂。


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