EventBus

EventBus依賴庫:
implementation 'org.greenrobot:eventbus:3.1.1'
 
 
EventBus主要角色:
  • Event 傳遞的事件對象
  • Subscriber 事件的訂閱者
  • Publisher 事件的發佈者
  • ThreadMode 定義函數在何種線程中執行
角色的協做圖
 
基本使用:
1. 首先在接收消息的方法中註冊EventBUs:
// EventBus.getDefault().register(this);
2. 而後建立方法來接受接收和處理事件:
@Subscribe
public void getEventData(FirstEvent event){}
3. 在onDestry()方法中註銷EventBus
EventBus.getDefault().unregister(this);
4. 發送消息
EventBus.getDefault().post(new FirstEvent(「張三」,20));
粘性事件使用:
在註冊以前可使用:EventBus.getDefaule().postSticky(new FirstEvent(「李四」,19));
Sticky=true才能夠接收消息.
@Subscribe (Sticky=true)//這個必須存在,否則程序會崩,或接收不到消息
public void getEventData(FirstEvent event){}
獲取和刪除粘性事件
MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);
// 判斷此粘性事件是否存在
if(stickyEvent != null) {
// 若粘性事件存在,將其刪除
EventBus.getDefault().removeStickyEvent(stickyEvent);
}
//取消所有的粘性廣播
EventBus.getDefault().removeAllStickyEvents()
 
設置優先級(粘性事件沒有優先級)
在EventBus中,觀察者也就是Subscription的優先級默認都爲0,級別越高,越早收到消息,而且收到消息以後還能阻斷後面觀察者接收消息,很有點像有序廣播。
注意一下:優先級只是在相同的ThreadMode中才有效,不一樣的ThreadMode不起做用
@Subscribe(priority = 100)
public void onEvent(MessageEvent event) {
}
 
// 取消分發的事件(只有在POSTING線程在才能取消事件,且只能用於取消非粘性事件)
EventBus.getDefault().cancelEventDelivery(event) ;
 
 
ThreadMode的使用
@Subscribe(threadMode = ThreadMode.MainThread) //在ui線程執行
public void onUserEvent(UserEvent event) { }
 
BackgroundThread和Async區別
BackgroundThread中的任務,一個接着一個去調用,中間使用了一個布爾型變量handlerActive進行的控制。會阻塞線程.也就是說只有一個子線程
Async則會動態控制併發,可能會有多個子線程
(若是任務是耗時任務會影響第二個任務執行得話,Async模式就會再爲第二個任務開啓新線程,若是第一個任務執行沒有影響到第二個任務開始執行,第二個任務開啓得線程就有可能剛執行完第一個任務得線程,線程池會複用線程)
 
EventBus3.0要點:
 
一、接受的地方須要註冊和解註冊
 
二、發送的Bean類本身定義,要傳哪些字段也本身在Bean中定義
 
三、EventBus3.0,接受消息的方法本身命名就能夠,參數是本身要接受的EventBean,可是必須加註解@subscribe
 
四、同一個類中,保證同一個EventBean只有一個接受方法,否則會接受錯亂
 
五、粘性廣播,若是 @subscribe (stricky = true ) 把sticky設置成ture ,在你註冊的一瞬間就會接收到粘性消息 (注意在註冊以前就先把將相關的對象實例化,由於接受是很快的,甚至來不及findviewById,不設置stricky = true的話默認不接受粘性廣播);
 
六、EventBus接受消息的地方能夠設置ThreadMode;
有四種ThreadMode , 默認狀況,和發送事件在同一個線程
 
//主線程中執行
@Subscribe(threadMode = ThreadMode.MainThread)
 
//後臺線程 (若是發送線程就是子線程的話,當前線程就是發送線程,若是不是的話,就新建一個子線程)
@Subscribe(threadMode = ThreadMode.BackgroundThread)
 
//強制後臺執行 s(每次都是開啓新的線程)
@Subscribe(threadMode = ThreadMode.Aync)
 
//默認狀況,和發送事件在同一個線程
@Subscribe(threadMode = ThreadMode.PostThread)
 
優缺點:
  1. EventBus是greenrobot公司出的另外一款開源框架,這個框架是針對Android優化的發佈/訂閱事件總線,使用EventBus能夠極大的減小咱們程序的耦合度。
  2. 調度靈活。不依賴於 Context,使用時無需像廣播同樣關注 Context 的注入與傳遞。
  3. 使用簡單。
  4. 快速且輕量。
  5. 徹底解耦了請求鏈之間的關係,避免了請求者被長持有,
  6. 比廣播更輕量
  7. 能夠定義在調用線程、主線程、後臺線程、異步。
缺點
  1. 各類Event的定義工做量大。每次傳的內容不同,就須要從新定義一個JavaBean
  2. 3.0以前限定了方法名(3.0已經能夠自定義方法名)
 
自擬面試題:
  1. 說說你對EventBus的瞭解:
以往我們在Fragment或Activity之間傳值的時候,有時候可能用一些靜態方法,比較佔用內存,容易形成oom,EventBus,它把註冊,發送,接收的方法都封裝的很簡潔,相對於以往的廣播,觀察者,接口回調等,使用起來更加方便;傳送的內容,是根據自定義的JavaBean來生成,須要傳什麼內容,就在Javabean建立什麼屬性,使用起來更加方便,隨意,實用性很高,並且耦合度很低,不會浪費內存!
 
  1. 說說你對EventBus3.0比2.x和優點
EventBus 2.x 是採用反射的方式對整個註冊的類的全部方法進行掃描來完成註冊,固然會有性能上的影響。EventBus 3.0中EventBus提供了EventBusAnnotationProcessor註解處理器來在編譯期經過讀取@Subscribe()註解並解析、處理其中所包含的信息,而後生成java類來保存全部訂閱者關於訂閱的信息,這樣就比在運行時使用反射來得到這些訂閱者的信息速度要快
 
//簡單使用
//大神深刻講解
//github連接
常見Bug:
粘性事件使用的時候:先尋找控件,而後再註冊EventBus接受消息,不然會形成控件空指針有異常.
 
//Logger依賴庫:
//compile 'com.orhanobut:logger:1.15'
相關文章
相關標籤/搜索