Android EventBus 3.0 框架用法詳解
看到大家提出的關於Android的問題,有一部分可以用EventBus解決,而也有相當多的人推薦使用EventsBus,因為其和GreenDAO出自一家公司,並且使用它非常的簡單,所以現在很多的網際網路app都會使用EventsBus來進行訊息傳遞。
基於此,有很多EventBus的文章,寫的非常的好,但是由於EventBus已經出了3.0版本,而國內的大多數翻譯只是停留在了2.4版本左右,對於那些剛剛接觸EventBus的人,從最新版接觸學習,是最理想的學習路線。
所以,在這兒,我總結下EventBus3.0的用法。
什麼是EventBus
EventBus是一個Android端優化的publish/subscribe訊息匯流排,簡化了應用程式內各元件間、元件與後臺執行緒間的通訊。比如請求網路,等網路返回時通過Handler或Broadcast通知UI,兩個Fragment之間需要通過Listener通訊,這些需求都可以通過 EventBus 實現。
EventBus框架
大家談到EventBus,總會想到greenrobot的EventBus,但是實際上EventBus是一個通用的叫法,例如Google出品的Guava,Guava是一個龐大的庫,EventBus只是它附帶的一個小功能,因此實際專案中使用並不多。用的最多的是greenrobot/EventBus,這個庫的優點是介面簡潔,整合方便,但是限定了方法名,不支援註解。另一個庫square/otto修改自 Guava ,用的人也不少。
這篇博文暫時只討論greenrobot的EventBus庫。
基本用法
很多文章會講到Subscriber,以及Publisher和ThreadMode等概念,我覺得暫時沒有必要,簡單粗暴,直接上程式碼:
新增依賴庫:
首先你要為你的app新增依賴庫:
compile 'de.greenrobot:eventbus:3.0.0-beta1'
關於如何新增依賴庫,請參考 Gradle for Android 第三篇( 依賴管理 ) 。
有些人會問為什麼是beta版本,因為eventbus現階段3.0版本只處於beta測試階段。有些人會問如何找到eventbus 3.0.0版本,具體新增:
註冊
舉個例子,你需要在一個activity中註冊eventbus事件,然後定義接收方法,這和Android的廣播機制很像,你需要首先註冊廣播,然後需要編寫內部類,實現接收廣播,然後操作UI,在EventBus中,你同樣需要這麼做。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EventBus.getDefault().register(this); } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); }
訂閱者
類似廣播,但是有別於2.4版本,你不必再去約定OnEvent方法開頭了(看不懂沒關係):
@Subscribe(threadMode = ThreadMode.MainThread) public void helloEventBus(String message){ mText.setText(message); }
該操作很簡單,定義了一個hello方法,需要傳入String引數,在其中操作UI操作,注意:我們新增了註解@Subscribe,其含義為訂閱者,在其內傳入了threadMode,我們定義為ThreadMode.MainThread,其含義為該方法在UI執行緒完成,這樣你就不要擔心丟擲異常啦。是不是很簡單?
釋出者
既然你在某個地方訂閱了內容,當然就會在某個地方釋出訊息。舉個例子,你的這個activity需要http請求,而http請求你肯定是在非同步執行緒中操作,其返回結果後,你可以這麼寫:
String json=""; EventBus.getDefault().post(json);
這樣就OK了,你可以試下能否正常執行了!
原理初探
你訂閱了內容,所以你需要在該類註冊EventBus,而你訂閱的方法需要傳入String,即你的接收資訊為String型別,那麼在post的時候,你post出去的也應該是String型別,其才會接收到訊息。
如果你post的是物件
首先你需要定義一個類似pojo類:
public class MessageEvent { public final String name; public final String password; public MessageEvent(String name,String password) { this.name = name; this.password=password; } }
然後你post的時候:
EventBus.getDefault().post(new MessageEvent("hello","world"));
當然,你接收的方法也需要改為:
@Subscribe(threadMode = ThreadMode.MainThread) public void helloEventBus(MessageEvent message){ mText.setText(message.name); }
疑問,當你post了訊息之後,你的訂閱者有多個,每一個都接收嗎?能否做到指定接收者。
下一章,帶來原始碼解析以及EventBus的高階用法;如果大家有興趣,也可帶領大家編寫屬於自己的EventBus框架,敬請期待。
相關文章
- Android訊息傳遞之EventBus 3.0使用詳解Android
- EventBus 3.0+ 原始碼詳解(史上最詳細圖文講解)原始碼
- Android EventBus3.x的使用詳解AndroidS3
- Android開源庫——EventBus高階用法Android
- EventBus 3.0 原始碼分析原始碼
- EventBus3.0解析之註解處理器S3
- Cordova android框架詳解Android框架
- ORM框架之GreenDao3.0使用詳解(二)ORM框架
- Android中的ANR用法詳解Android
- Android中Context用法詳解AndroidContext
- EventBus3.0原始碼解析S3原始碼
- EventBus詳解及原始碼分析原始碼
- Android開源框架原始碼鑑賞:EventBusAndroid框架原始碼
- Android資料儲存之GreenDao 3.0 詳解Android
- Android 框架煉成 教你如何寫元件間通訊框架EventBusAndroid框架元件
- EventBus詳解及簡單例項單例
- 《NetkillerAndroid手札》之EventBus使用詳解Android
- extern用法詳解
- Metasploit用法詳解
- xargs用法詳解
- Nmap用法詳解
- mount用法詳解
- 手寫Android事件匯流排框架Eventbus(簡易版)Android事件框架
- Android 認識EventBus輕量級事件匯流排框架Android事件框架
- vue3.0API詳解VueAPI
- TDengine 3.0 架構詳解架構
- Android ORMLite 框架的入門用法AndroidORM框架
- Flutter ListView 用法詳解FlutterView
- MyBatis Generator 用法詳解MyBatis
- iconfont用法詳解
- Promise用法詳解(一)Promise
- StringTie用法詳解
- SVG <markers>用法詳解SVG
- Elasticsearch SQL用法詳解ElasticsearchSQL
- git stash用法詳解Git
- JSONP用法詳解JSON
- Generator用法詳解+co
- appendChild()用法詳解APP