看到大家提出的關(guān)于Android的問題澈侠,有一部分可以用EventBus解決延旧,而也有相當(dāng)多的人推薦使用EventsBus,因為其和GreenDAO出自一家公司,并且使用它非常的簡單葵礼,所以現(xiàn)在很多的互聯(lián)網(wǎng)app都會使用EventsBus來進(jìn)行消息傳遞号阿。
基于此,有很多EventBus的文章章咧,寫的非常的好倦西,但是由于EventBus已經(jīng)出了3.0版本,而國內(nèi)的大多數(shù)翻譯只是停留在了2.4版本左右赁严,對于那些剛剛接觸EventBus的人扰柠,從最新版接觸學(xué)習(xí),是最理想的學(xué)習(xí)路線疼约。
所以卤档,在這兒,我總結(jié)下EventBus3.0的用法程剥。
什么是EventBus
EventBus是一個Android端優(yōu)化的publish/subscribe消息總線劝枣,簡化了應(yīng)用程序內(nèi)各組件間、組件與后臺線程間的通信织鲸。比如請求網(wǎng)絡(luò)舔腾,等網(wǎng)絡(luò)返回時通過Handler或Broadcast通知UI,兩個Fragment之間需要通過Listener通信搂擦,這些需求都可以通過EventBus實現(xiàn)稳诚。
EventBus框架
大家談到EventBus,總會想到greenrobot的EventBus瀑踢,但是實際上EventBus是一個通用的叫法扳还,例如Google出品的Guava才避,Guava是一個龐大的庫,EventBus只是它附帶的一個小功能氨距,因此實際項目中使用并不多桑逝。用的最多的是greenrobot/EventBus,這個庫的優(yōu)點是接口簡潔俏让,集成方便楞遏,但是限定了方法名,不支持注解舆驶。另一個庫square/otto修改自 Guava 橱健,用的人也不少。
這篇博文暫時只討論greenrobot的EventBus庫沙廉。
基本用法
很多文章會講到Subscriber,以及Publisher和ThreadMode等概念臼节,我覺得暫時沒有必要撬陵,簡單粗暴,直接上代碼:
添加依賴庫:
首先你要為你的app添加依賴庫:
compile'de.greenrobot:eventbus:3.0.0-beta1'
關(guān)于如何添加依賴庫网缝,請參考Gradle for Android 第三篇( 依賴管理 )巨税。
有些人會問為什么是beta版本,因為eventbus現(xiàn)階段3.0版本只處于beta測試階段粉臊。有些人會問如何找到eventbus 3.0.0版本草添,具體添加:
注冊
舉個例子,你需要在一個activity中注冊eventbus事件扼仲,然后定義接收方法远寸,這和Android的廣播機(jī)制很像,你需要首先注冊廣播屠凶,然后需要編寫內(nèi)部類驰后,實現(xiàn)接收廣播,然后操作UI,在EventBus中矗愧,你同樣需要這么做灶芝。
@Override
protectedvoidonCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
}
@Override
protectedvoidonDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
訂閱者
類似廣播,但是有別于2.4版本唉韭,你不必再去約定OnEvent方法開頭了(看不懂沒關(guān)系):
@Subscribe(threadMode =ThreadMode.MainThread)
publicvoidhelloEventBus(String message){
mText.setText(message);
}
該操作很簡單夜涕,定義了一個hello方法,需要傳入String參數(shù)属愤,在其中操作UI操作女器,注意:我們添加了注解@Subscribe,其含義為訂閱者春塌,在其內(nèi)傳入了threadMode晓避,我們定義為ThreadMode.MainThread簇捍,其含義為該方法在UI線程完成,這樣你就不要擔(dān)心拋出異常啦俏拱。是不是很簡單暑塑?
發(fā)布者
既然你在某個地方訂閱了內(nèi)容,當(dāng)然就會在某個地方發(fā)布消息锅必。舉個例子事格,你的這個activity需要http請求,而http請求你肯定是在異步線程中操作搞隐,其返回結(jié)果后驹愚,你可以這么寫:
String json="";
EventBus.getDefault().post(json);
這樣就OK了,你可以試下能否正常運行了劣纲!
原理初探
你訂閱了內(nèi)容逢捺,所以你需要在該類注冊EventBus,而你訂閱的方法需要傳入String,即你的接收信息為String類型癞季,那么在post的時候劫瞳,你post出去的也應(yīng)該是String類型,其才會接收到消息绷柒。
如果你post的是對象
首先你需要定義一個類似pojo類:
public class MessageEvent{
public final String name;
public final String password;
public MessageEvent(Stringname,String password) {
this.name = name;
this.password=password;
}
}
然后你post的時候:
EventBus.getDefault().post(newMessageEvent("hello","world"));
當(dāng)然志于,你接收的方法也需要改為:
@Subscribe(threadMode =ThreadMode.MainThread)
public void helloEventBus(MessageEventmessage){
mText.setText(message.name);
}
疑問,當(dāng)你post了消息之后废睦,你的訂閱者有多個伺绽,每一個都接收嗎?能否做到指定接收者嗜湃。