JavaShuo
欄目
標籤
EventBus
時間 2019-11-18
標籤
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)
優缺點:
EventBus是
greenrobot
公司出的另外一款開源框架,這個框架是針對Android優化的發佈/訂閱事件總線,使用EventBus能夠極大的減小咱們程序的耦合度。
調度靈活。不依賴於 Context,使用時無需像廣播同樣關注 Context 的注入與傳遞。
使用簡單。
快速且輕量。
徹底解耦了請求鏈之間的關係,避免了請求者被長持有,
比廣播更輕量
能夠定義在調用線程、主線程、後臺線程、異步。
缺點
各類Event的定義工做量大。每次傳的內容不同,就須要從新定義一個JavaBean
3.0以前限定了方法名(3.0已經能夠自定義方法名)
自擬面試題:
說說你對EventBus的瞭解:
以往我們在Fragment或Activity之間傳值的時候,有時候可能用一些靜態方法,比較佔用內存,容易形成oom,EventBus,它把註冊,發送,接收的方法都封裝的很簡潔,相對於以往的廣播,觀察者,接口回調等,使用起來更加方便;傳送的內容,是根據自定義的JavaBean來生成,須要傳什麼內容,就在Javabean建立什麼屬性,使用起來更加方便,隨意,實用性很高,並且耦合度很低,不會浪費內存!
說說你對EventBus3.0比2.x和優點
EventBus 2.x 是採用反射的方式對整個註冊的類的全部方法進行掃描來完成註冊,固然會有性能上的影響。EventBus 3.0中EventBus提供了EventBusAnnotationProcessor註解處理器來在編譯期經過讀取@Subscribe()註解並解析、處理其中所包含的信息,而後生成java類來保存全部訂閱者關於訂閱的信息,這樣就比在運行時使用反射來得到這些訂閱者的信息速度要快
//簡單使用
http://blog.csdn.net/qq_35045932/article/details/53130317
//大神深刻講解
http://blog.csdn.net/io_field/article/details/52185717
//github連接
https://github.com/greenrobot/EventBus
常見Bug:
粘性事件使用的時候:先尋找控件,而後再註冊EventBus接受消息,不然會形成控件空指針有異常.
//Logger依賴庫:
//compile 'com.orhanobut:logger:1.15'
相關文章
1.
EventBus
2.
eventBus
3.
eventbus
4.
EventBus、Otto
5.
Android EventBus
6.
Guava EventBus
7.
EventBus 一
8.
android EventBus
9.
EventBus & Vuex?
10.
GWT EventBus
更多相關文章...
相關標籤/搜索
eventbus
springboot+eventbus
0
分享到微博
分享到微信
分享到QQ
每日一句
每一个你不满意的现在,都有一个你没有努力的曾经。
最新文章
1.
Excel教程:排序-篩選-切片-插入表格
2.
ZigBee ProfileID,DeviceID,ClusterID
3.
二維碼背後不能不說的祕密Part1~
4.
基於迅爲i.MX6平臺 | 智能家居遠程監控系統
5.
【入門篇】ESP8266直連智能音箱(天貓精靈)控制智能燈
6.
MongoDB安裝問題
7.
【建議收藏】22個適合程序員多逛逛的網站
8.
【建議收藏】10個適合程序員逛的在線社區
9.
Attention-Based SeriesNet論文讀後感
10.
Flutter中ListView複用原理探索
本站公眾號
歡迎關注本站公眾號,獲取更多信息
相關文章
1.
EventBus
2.
eventBus
3.
eventbus
4.
EventBus、Otto
5.
Android EventBus
6.
Guava EventBus
7.
EventBus 一
8.
android EventBus
9.
EventBus & Vuex?
10.
GWT EventBus
>>更多相關文章<<