1. 程式人生 > >Android元件間通訊——EventBus

Android元件間通訊——EventBus

    在Android開發中,元件間通訊一直是一個不可忽視的部分。當然,元件之間的通訊有很多種方式可以選擇,本文就利用EventBus通訊的方式進行論述。

EventBus是一個第三方框架,它的簡單使用分為如下幾步:

    1. 下載框架原始碼,並匯入工程中。

    2. 定義事件類,並廣播事件

    例如下面這個自定義事件類MessageEvent

public class MessageEvent {
    public final String message;

    public MessageEvent(String message) {
        this.message = message;
    }
}

EventBus通訊也是基於事件的,寫好事件類,然後你就可以用EventBus把你定義的事件廣播出去,如:

EventBus.getDefault().post(new MessageEvent("Hello everyone!"));

    3. 準備好事件接受者

    通訊嘛,其實本質上挺簡單的,就是一個元件廣播事件,然後另一個接收就OK了。我們在上一步已經介紹瞭如何廣播事件,接下來就介紹最後一步,準備好事件接受者。其實準備好接收者挺簡單的,EventBus並註冊定義一個函式就OK了。舉個例子,假如我們的一個接收者是Activity,那麼程式碼就會有如下形式:

    @Override
    public void onStart() {
        super.onStart();
        EventBus.getDefault().register(this);
    }

    @Override
    public void onStop() {
        EventBus.getDefault().unregister(this);
        super.onStop();
    }
    
    public void onEvent(MessageEvent event){
      Toast.makeText(getActivity(),event.message,Toast.LENGTH_SHORT).show();
    }
	   
    public void onEvent(SomeOtherEvent event){
        doSomethingWith(event);
    }

    程式碼中,EventBus.getDefault().register(this)和EentBus.getDefault().unregister(this);分別是EventBus的註冊和反註冊。在註冊之後,程式碼中又定義了兩個函式,onEvent(MessageEvent event)和onEvent(SomeOtherEventevent)。當我們呼叫EventBus.getDefault().post(new MessageEvent("Helloeveryone!"))時,所有已經完成EventBus註冊並定義onEvent(MessageEvent event)的接收者將會接收到事件(準備好的接收者未必只有一個),並且相應接收者中的onEvent(MessageEvent event)將會被呼叫。如果我們呼叫EventBus.getDefault().post(newMessageEvent("Hello everyone!")),那麼相應接收者的onEvent(SomeOtherEventevent)將會被呼叫,這個沒什麼好說的,就是一個Overload。至此,已經完成了“廣播——接收”的過程,簡單的通訊已經完成。

    以上只研究了簡單通訊過程,接下來對一些問題進行詳細討論。

    1. ThreadModes

    在上文我們說要在接收者中定義onEvent函式,其實我們未必非要定義onEvent,也可以選擇其它函式,可選函式有如下4個:

    public voidonEvent(MessageEvent event);

    publicvoid onEventMainThread(MessageEvent event);

    publicvoid onEventBackgroundThread(MessageEvent event);

    publicvoid onEventAsync(MessageEvent event);
我們可以在這4箇中選一個進行定義就可以了。到這裡你可能要問,這4個函式有啥區別嗎?當然,是有區別的,區別在於這四個函式執行時所在的執行緒,這就引出了EventBus的ThreadModes。

    onEvent(MessageEventevent)和EventBus.post(Object object)執行在同一個執行緒中,也就是在哪個執行緒中廣播的事件,就在哪個執行緒中執行onEvent(MessageEvent event)。

    onEventMainThread(MessageEventevent)不管EventBus.post(Object object)是在哪個執行緒中呼叫的,都會在主執行緒中執行。當我們需要更新UI時,定義onEventMainThread(MessageEvent event)是再方便不過的了。

    onEventBackgroundThread(MessageEventevent)和onEventMainThread(MessageEvent event)正相反,不管EventBus.post(Objectobject)是在哪個執行緒中呼叫的,都會在後臺執行緒中執行。當我們在主執行緒中呼叫EventBus.post(Object object)時,onEventBackgroundThread(MessageEventevent)將會在一個新的執行緒中執行;相反,當我們在後臺執行緒中呼叫EventBus.post(Object object)時,onEventBackgroundThread(MessageEventevent)將會執行在EventBus.post(Object object)執行緒中。 

    onEventAsync(MessageEventevent) 不管EventBus.post(Object object)是在哪個執行緒中呼叫的,都會在一個新執行緒中執行,該新執行緒一般是後臺執行緒。

    2.有序廣播事件

    EventBus.register(Objectsubscriber)還有另外一個過載形式EventBus .register(Object subscriber, intpriority),其中priority便是接受者的優先順序,預設優先順序為0。對於那些事件處理函式(即上文說過的那4個)將會執行在同一個執行緒中的接受者,將會按優先順序從大到小的順序接收事件。