一、EventBus框架的github地址:github.com/greenrobot/EventBus
主要用于事件的發布和訂閱,是一個發布/訂閱的事件總線
包含四個成分:發布者、訂閱者、事件和總線
四者之間的關系:訂閱者訂閱事件到總線,發送者發布事件,訂閱者可以訂閱多個事件,發送者可以發布任何事件,發布者同時也可以是訂閱者
二、實例
兩個Fragment組成主界面,左邊的Fragment是目錄(列表),右邊的Fragment是詳細信息界面
1、左邊目錄是從網絡獲取的;
2、當點擊目錄上的列表條目的時候,動態更新詳細信息界面
傳統的做法是:
1、左邊目錄Fragment在onCreate中去開啟線程去訪問網絡獲取數據,獲取完成之后通過handler去更新界面
2、左邊目錄Fragment提供一個接口,然后詳細信息界面去注冊這個接口,當發生點擊時,去回調這個接口,讓詳細信息界面發生改變,這一傳統的操作方法可以用EventBus來代替完成
EventBus的做法是:
EventBus.getDefault().register(this);//訂閱事件
EventBus.getDefault().post(object);//發布事件
EventBus.getDefault().unregister(this);//取消訂閱
1、在onCreate中進行了事件的訂閱,,onDestroy里進行了事件的取消,onViewCreate里模擬一個子線程去網絡加載數據,獲取成功后我們調用EventBus.getDefault().post()發布一個事件
2、總得流程是:onCreate時,EventBus掃描當前類,將onEventMainThread以鍵值對的形式存儲,鍵為Item.class,值為包含該方法的對象,當點擊事件發生時,出發onEventMainThread方法,并把item值傳進來,更新控件
三、EventBus的ThreadMode
1、EventBus包含4個ThreadMode:PostThread,MainThread,BackgroundThread,Async
2、具體的方法名為:onEventPostThread, onEventMainThread,onEventBackgroundThread,onEventAsync
3、區別:
onEventMainThread代表這個方法會在UI線程執行
onEventPostThread代表這個方法會在當前發布事件的線程執行
BackgroundThread這個方法,如果在非UI線程發布的事件,則直接執行,和發布在同一個線程中。如果在UI線程發布的事件,則加入后臺任務隊列,使用線程池一個接一個調用
Async 加入后臺任務隊列,使用線程池調用,注意沒有BackgroundThread中的一個接一個