編輯:關於Android編程
項目使用的技術呢,說白了,就是將要傳遞的event(一個Object對象,可任意自定義),發送到公共的組件EventBus中進行存儲,
在通過EventBus傳遞給訂閱者(使用者),訂閱者收到event消息,就可以自行處理了。
不要被標題迷惑了,其實在任何地方 都可以發送和接收event(event,是一個通稱,表示任意的數據對象,是一個消息類型)。
當然有需要注意的地方了,往下看吧。
分析一個基本的使用流程:
1. 自定義一個event類型:需要什麼樣的數據,就定義成什麼樣,隨意了
2. 確定在哪裡來接收該event,就在哪裡調用EventBus.getDefault().register()進行訂閱者的注冊。
EventBus 一看就是個單例類,所以通過它存儲、發送event。
register()有多個重載方法:
[java] view plaincopyprint?
看名字也很好理解,subscriber即訂閱者(接收處理event的類);priority即優先級,表示優先處理;
sticky粘性的意思,在源碼中會有一個map對象,來存儲sticky的event,
因為map的key是onEvent...()方法的第一個參數類型,
一般呢,這第一個參數就是訂閱者對象,所以map會存儲該類型的最後一次發送的event對象。
這些register都會最終調用一個私有register方法實現的,在這個方法裡有個參數是SubscriberMethod對象。
調用subscriberMethod.findSubscriberMethods(), 查找到訂閱者定義的接收處理event的方法,
並在EventBus中存起來。
3. 在訂閱者中定義接收處理event的方法,約定為:
onEvent、onEventMainThread、onEventBackgroundThread、onEventAsync
使用時類似這樣的:public void onEvent(Object event)。 onEvent對應PostThread,其他各自對應ThreadMode中的其他定義。
onEvent後面跟的這些名稱的意義,見ThreadMode
4. 發送事件
調用EventBus.getDefault().post(Object event),發送事件
源碼中會調用postToSubscription(),發送event給對應的訂閱者方法
ThreadMode
這是一個枚舉類。定義了四種類型:PostThread、MainThread、BackgroundThread、Async
PostThread 事件event的處理和發送都在相同線程中
MainThread 事件event的處理在主線程中,小心ANR
BackgroundThread 事件event的處理在後台線程中,它是阻塞式的,如有多個事件發送過來,會一個一個處理
Async 事件event的處理是異步的,即新開一個線程進行處理。
簡單使用
(1)自定義一個類,可以是空類,比如:
[java] view plaincopy
(2)在要接收消息的頁面注冊:
[java] view plaincopy
(3)發送消息
[java] view plaincopy
(4)接受消息的頁面實現(共有四個函數,各功能不同,這是其中之一,可以選擇性的實現,這裡先實現一個):
[java] view plaincopy
請參考 http://blog.csdn.net/harvic880925/article/details/40660137
引言我們在android的APP開發中有時候會碰到提供一個選項列表供用戶選擇的需求,如在投票類型的項目中,我們提供一些主題給用戶選擇,每個主題有若干選項,用戶對這些主題的
1、View和ViewRootViewRoot從名稱上來理解似乎是“View樹的根”,這很容易讓人產生誤解。因為ViewRoot並不屬於View樹
最近相對來說比較閒,加上養病,所以沒事干就撸些自己之前的知識點為博客,方便自己也方便別人。1 背景之所以選擇這個知識點來分析有以下幾個原因:逛GitHub時發
在介紹程序實現之前,我們先看下Android中Activities和Task的基礎知識。 我們都知道,一個Activity 可以啟動另一個Activity,即使這個Ac