一、簡(jiǎn)介
? ? ? ? 標(biāo)準(zhǔn)解釋?zhuān)篈ndroid optimized event bus that simplifies communication between Activities,Fragments, Threads, Services, etc. Less code, better quality.
??????? 瞎翻譯:簡(jiǎn)化Activity、Fragment偏竟、Thread牵署、Service間通信的Android優(yōu)化事件總線(xiàn)豺总,不僅代碼量不大隔显,而且效率很高项鬼。
? ? ? ? 事件總線(xiàn):基于觀察者模式的事件發(fā)布/訂閱框架。類(lèi)似框架還有otto 耻陕,EventBus官網(wǎng)在這里 拙徽、GitHub網(wǎng)址在這里 ,詳細(xì)介紹還是移步官網(wǎng)(英文版诗宣,一臉懵逼ing斋攀。。梧田。),好啦侧蘸,官圖解釋如下:
二裁眯、應(yīng)用
1、添加依賴(lài)
??????? 當(dāng)然是在module下的gradle文件中了讳癌,哈哈穿稳!
compile'org.greenrobot:eventbus:3.0.0'
2、注冊(cè)與注銷(xiāo)
??????? 2.1晌坤、注冊(cè)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
}
??????? 2.2逢艘、注銷(xiāo)
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unRegister(this);
}
3、事件發(fā)送
??????? 3.1骤菠、普通事件
EventBus.getDefault().post("str");//
??????? 3.2它改、粘性事件
EventBus.getDefault().postSticky("str");//
4、事件接收與處理
??????? 4.1商乎、Activity中接收
@Subscribe(threadMode= ThreadMode.MAIN,priority=100)
public void onEventMainActivity(String string) {
Toast.makeText(getApplicationContext(),"主界面收到消息",Toast.LENGTH_LONG).show();
}
??????? 4.2央拖、Fragment中接收
@Subscribe(threadMode= ThreadMode.MAIN,sticky=true,priority=100)
public void onEventOnFragment(String message){
textView.setText("點(diǎn)擊evnetbus之后");
}
5、效果
??????? 5.1、發(fā)送消息之前
??????? 5.2鲜戒、發(fā)送消息之后
6专控、其他
??????? 6.1、注解參數(shù)
??????? 6.1.1遏餐、線(xiàn)程模式
??????? (1)postThread:用戶(hù)將被調(diào)用在同一個(gè)線(xiàn)程中伦腐,這是發(fā)布事件(這是默認(rèn)值)。事件傳遞意昧著最少的開(kāi)銷(xiāo)失都,因?yàn)樗耆苊饬司€(xiàn)程切換柏蘑。因此,這是推薦的模式嗅剖,來(lái)處理簡(jiǎn)單的任務(wù)辩越,如果是已知的完成是一個(gè)很短的時(shí)間,而不需要主線(xiàn)程信粮。事件處理使用此模式必須迅速返回黔攒,以避免阻塞發(fā)布線(xiàn)程,這可能是主線(xiàn)程强缘。
??????? (2)MainThread:用戶(hù)將被調(diào)用在主線(xiàn)程(UI線(xiàn)程)督惰。如果發(fā)布線(xiàn)程是主線(xiàn)程,事件處理程序方法將直接調(diào)用旅掂。使用此模式的事件處理程序必須快速返回赏胚,避免阻塞主線(xiàn)程。
??????? (3)BackgrounThread:將在后臺(tái)線(xiàn)程中調(diào)用訂閱者商虐。如果發(fā)布線(xiàn)程不是主線(xiàn)程觉阅,則事件處理程序方法將被在發(fā)布線(xiàn)程中直接調(diào)用。如果線(xiàn)程是主線(xiàn)程秘车,eventbus采用單獨(dú)的一個(gè)后臺(tái)線(xiàn)程典勇,將按順序調(diào)用所有的事件。使用此模式的事件處理程序應(yīng)嘗試快速返回叮趴,以避免阻塞后臺(tái)線(xiàn)程割笙。
??????? (4)Async:事件處理程序方法在一個(gè)單獨(dú)的線(xiàn)程中調(diào)用。這總是獨(dú)立于發(fā)布線(xiàn)程和主線(xiàn)程眯亦。發(fā)布事件從來(lái)不會(huì)等待使用這種模式的事件處理程序方法伤溉。事件處理程序方法使用此模式,如果他們的執(zhí)行可能需要一段時(shí)間妻率,例如用于網(wǎng)絡(luò)訪(fǎng)問(wèn)乱顾。避免觸發(fā)大量在同一時(shí)間運(yùn)行長(zhǎng)時(shí)間運(yùn)行的異步處理程序方法以限制并發(fā)線(xiàn)程的數(shù)目。eventbus使用一個(gè)線(xiàn)程池來(lái)有效地重用已完成的異步事件處理程序通知的線(xiàn)程舌涨。
threadMode= ThreadMode.MAIN,//指運(yùn)行的線(xiàn)程:postThread糯耍、MainThread扔字、BackgrounThread、Async
? ? ? ? 6.1.2温技、是否接收粘性事件
sticky=true,//是否接收粘性事件
?????? 6.1.3革为、優(yōu)先級(jí)
??????? 優(yōu)先級(jí),如果同時(shí)存在多個(gè)觀察者(threadMode相同)舵鳞,我們是不是可以通過(guò)優(yōu)先級(jí)的設(shè)定震檩,來(lái)決定哪一個(gè)觀察者獲得事件或者消息的順序,這樣就更加靈活了
priority=100//
??????? 6.2蜓堕、粘性與非粘性的區(qū)別
? ? ? ? 粘性事件是指:一些事件進(jìn)行信息感興趣的事件后發(fā)布抛虏。 例如,一個(gè)事件信號(hào),一些初始化完成√撞牛或者如果你有傳感器位置數(shù)據(jù)和你想抓住最近的值迂猴。而不是實(shí)現(xiàn)自己的緩存,您可以使用黏性的事件。EventBus保持過(guò)去的事件的特定類(lèi)型在內(nèi)存中背伴。黏性的事件可以交付給用戶(hù)或顯式查詢(xún)沸毁。因此,你不需要任何特殊的邏輯來(lái)考慮可用的數(shù)據(jù)。粘性事件發(fā)布,開(kāi)始一個(gè)新的活動(dòng)傻寂。在注冊(cè)過(guò)程中粘性用戶(hù)所有方法將立即得到前面貼粘性的事件息尺。
??????? 因此兩者區(qū)別在于接收并處理事件的類(lèi)是否創(chuàng)建,如若創(chuàng)建疾掰,兩種事件均可以搂誉,如若未創(chuàng)建,那么就用粘性事件静檬。
??????? 另:本人水平有限炭懊,若有不足甚至錯(cuò)誤的地方,歡迎批評(píng)指正拂檩,本人感激不盡凛虽。