1.概述
在之前的博文中簡單介紹過如何實作fragment之間的資訊互動:《Android中Fragment與Activity之間的互動(兩種實作方式)》,今天繼續給大家介紹一種可以實作此效果的另外一種方式EventBus。(相比于handler,接口回調,bundle傳參,這個簡單好用到哭)
EventBus是Android下高效的釋出/訂閱事件的消息總線。作用是可以代替傳統的Intent,Handler,Broadcast或接口函數在Fragment、Activity、Service、線程之間傳遞資料進行通信,執行方法。做為消息總線,有三個主要元素:
(1)Event:事件
(2)Subscriber:事件訂閱者,接受特定的事件
(3)Publisher:事件釋出者,用于通知Subscriber有事件發生
結合EventBus以上的三個元素,我們也可以稱其為一種觀察者設計模式。
EventBus 官網連結http://greenrobot.org/eventbus/
EventBus GitHub連結https://github.com/greenrobot/EventBus
前期相關博文連結:
Android中Fragment與Activity之間的互動(兩種實作方式)
Android中Fragment的兩種建立方式
(1)示例中左側的按鈕,潘侯爺與碧空海觸發的事件為EventBus的普通事件釋出
(2)左側粘性事件按鈕釋出的為粘性事件

本次Demo架構:
使用AndroidStudio2.2。仍然采用在build.gradle下中dependencies下直接添加如下代碼:
同步後完成依賴添加。
(1)layout中主布局檔案,activity_main.xml檔案
(2)layout中右側的fragment布局檔案fragment_msg.xml檔案
(3)layout中粘性事件的示範界面布局activity_main2.xml檔案
(1)自定義事件類
本次示範最簡單事件的釋出,事件僅釋出字元串資料,MessageEvent.java檔案如下:
(2)MsgFragment.java
右側fragment對應的java類,除了在其中關聯其對應的fragment布局外,還需要添加修改fragment中文本的方法,如下:
(3)MainActivity.java
MainActivity.java對應的布局為主布局,右側的fragment附屬于該布局,是以需要在該類中注冊EventBus,将目前的Activity注冊為事件訂閱者,具體代碼如下:
(4)Main2Activity.java
注意:此布局作為粘性事件釋出的訂閱者,同樣需要注冊EventBus
釋出的粘性事件在其新訂閱者注冊後将會自動傳遞給新訂閱者,有時我們也需要移除粘性事件,以免它在傳遞下去。
EventBus提供了四種線程模式:
(1)postThread:使用者将被調用在同一個線程中,這是釋出事件(這是預設值)。事件傳遞意昧着最少的開銷,因為它完全避免了線程切換。是以,這是推薦的模式,來處理簡單的任務,如果是已知的完成是一個很短的時間,而不需要主線程。事件處理使用此模式必須迅速傳回,以避免阻塞釋出線程,這可能是主線程。
(2)MainThread:使用者将被調用在主線程(UI線程)。如果釋出線程是主線程,事件處理程式方法将直接調用。使用此模式的事件處理程式必須快速傳回,避免阻塞主線程。
(3)BackgrounThread:将在背景線程中調用訂閱者。如果釋出線程不是主線程,則事件處理程式方法将被在釋出線程中直接調用。如果線程是主線程,eventbus采用單獨的一個背景線程,将按順序調用所有的事件。使用此模式的事件處理程式應嘗試快速傳回,以避免阻塞背景線程。
(4)Async:事件處理程式方法在一個單獨的線程中調用。這總是獨立于釋出線程和主線程。釋出事件從來不會等待使用這種模式的事件處理程式方法。事件處理程式方法使用此模式,如果他們的執行可能需要一段時間,例如用于網絡通路。避免觸發大量在同一時間運作長時間運作的異步處理程式方法以限制并發線程的數目。eventbus使用一個線程池來有效地重用已完成的異步事件處理程式通知的線程。
本文轉自 sshpp 51CTO部落格,原文連結:http://blog.51cto.com/12902932/1927602,如需轉載請自行聯系原作者