EventBus的使用

如果你學習過設計模式,那麼當想通知其他組件某些事情發生時你一定會使用觀察者模式。好了,既然能想到這個設計模式,那麼就來看一個屌爆天的Android開源框架EventBus。主要功能是替代Intent、Handler、BroadCast在Fragment、Activity、Service、線程之間傳遞消息。他的最牛逼優點是開銷小,代碼簡潔,解耦代碼。
上面說了,EventBus是一個觀察者模式的實現,既然這樣,那他就有如下三個要素:

Event:事件
Subscriber:事件訂閱者,接收特定的事件。
Publisher:事件發佈者,用於通知Subscriber有事件發生。

其中,Event可以使任意類型對象。Subscriber都是以約定的onEvent開頭的函數,具體是onEvent,onEventMainThread,onEventBackgroundThread,onEventAsync這四個。Publisher可以通過post(Object)在任意線程任意位置發送事件。
它有幾個重要的函數來處理這個event

onEvent:事件的處理在和事件的發送在相同的線程,所以事件處理時間不應太長,不然影響事件的發送線程。

onEventMainThread: 事件的處理會在UI線程中執行。事件處理時間不能太長,長了會出現臭名遠之的ANR。

onEventBackgroundThread:事件的處理會在一個後臺線程中執行。雖然名字是BackgroundThread,事件處理是在後臺線程,但事件處理時間還是不應該太長,因爲如果發送事件的線程是後臺線程,會直接在當前後臺線程執行事件;如果當前線程是UI線程,事件會被加到一個隊列中,由一個線程依次處理這些事件,如果某個事件處理時間太長,會阻塞後面的事件的派發或處理。

onEventAsync:事件處理會在單獨的線程中執行,主要用於在後臺線程中執行耗時操作,每個事件會開啓一個線程,但最好限制線程的數目
下面我們來看看究竟怎麼用
比如我們從一個service 計算出一個答案返回給MainActivity
1:我們首先在MainActivity來註冊,:

EventBus.getDefault().register(this);

2:在MainActivity來重寫上面幾個方法,比如

public void onEventMainThread(TestEvent event) {
        Toast.makeText(MainActivity.this, "收到操作請求,正在處理...", 0).show();
        HashMap<String, String> hash = event.getMsg();
        ...
        ...
        //我們從event裏面拿到一個HsahMap 這個參數其實是一個類 我們來看這個類
    }
import java.util.HashMap;

public class FirstEvent {

    private HashMap<String, String> mMsg;

        public TestEvent(HashMap<String, String> hash) {
        // TODO Auto-generated constructor stub
        mMsg = hash;
    }

    public HashMap<String, String> getMsg() {
        return mMsg;
    }
}

最後一步 在需要傳遞消息的地方post這個消息

HashMap<String, String> hash = new HashMap<String, String>();
        hash.put("test","test");
        EventBus.getDefault().post(new FirstEvent(hash));

到這裏就完成了eventbus的使用

發佈了35 篇原創文章 · 獲贊 9 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章