詳解EventBus 3.x 的快速使用
EventBus 可以很方便地進行各組件間的通信,解耦性更強,比廣播更好用。
EventBus 3 簡介
EventBus是一種為了優(yōu)化Android組件之間事件傳遞的解耦工具,通過發(fā)布/訂閱事件總線來實現(xiàn)事件在不同組件之間的事件傳遞。
在EventBus 3之前,greenrobot團隊因為考慮性能原因所以比較抵觸使用注解框架。目前的EventBus3開始使用注解來申明訂閱事件的處理方法。雖然目前Android 6 和ART都有了,但是對于Java反射造成的性能影響還是沒能很好的解決。
在EventBus3中,greenrobot團隊通過利用在編譯時檢索所有注解代碼,然后生成一個包含所有在運行時要花很大代價才能獲取的數(shù)據(jù)的類,通過這種新的注解處理方式來提升性能,讓EventBus3比其他的eventbus會更加快。在后文中會貼出和otto的性能比較。
EventBus 3 和 EventBus 2.x 的區(qū)別
回調(diào)方法改動
由于API的改動,會導致EventBus3和之前使用老版本的EventBus不兼容,因為之前版本(EventBus 2.x),在注冊完事件之后,會要求寫相應 onEvent()方法,包括onEvent()、onEventAsync()、onEventBackground()、onEventMainThread() 分別對應 @Subscrible 、@Subscrible(threadMode = ThreadMode.ASYNC)、@Subscribe(threadMode = ThreadMode.BACKGROUND)、@Subscribe(threadMode = ThreadMode.MAIN) 。EventBus 3中在未聲明threadMob時,默認的線程模式為ThreadMode.POSTING。
異常容錯處理
在EventBus3中,如果在@Subscrible標注的方法中,如果程序出錯,不會立即使程序crash,而是由EventBus攔截異常,并打印錯誤日志。
用戶可以通過EventBusBuilder來配置獲取EventBus實例后的對象,來決定在處理event時是否需要拋出異常信息:
eventBus = EventBus.builder().sendNoSubscriberEvent(false)
.sendSubscriberExceptionEvent(false)
.throwSubscriberException(BuildConfig.DEBUG) //只有在debug模式下,會拋出錯誤異常
.build();
以上代碼使用Builder設計模式,來構(gòu)建返回一個eventBus實例。在調(diào)試階段,可以在程序出現(xiàn)異常時直接Crash發(fā)現(xiàn)錯誤。
快速使用
1. 編譯
compile 'org.greenrobot:eventbus:3.1.1'
2. 自定義事件類
public class MessageEvent {
// 成員變量根據(jù)自己的需求創(chuàng)建
private int type;
// 通過構(gòu)造方法傳遞數(shù)據(jù)
public MessageEvent(int type) {
this.type = type;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
}
3. 注冊事件與解除注冊
一般來說,在 OnCreate() 方法中進行注冊:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout);
EventBus.getDefault().register(this);
}
與之對應的,在 OnDestroy() 中解除注冊:
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
4. 發(fā)送事件
EventBus.getDefault().post(new MessageEvent(type));
5. 接收與處理事件
/**
* @Subscribe 注解必須要寫,線程需要指定
* 方法名可隨意
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
switch (event.getType()){
// do your thing
}
}
上面提到了線程模型,它一共有 5 種:
- POSTING(默認): 事件處理方法的線程跟發(fā)布事件的線程是同一個線程;
- MAIN:在 Android 中,事件處理方法在主線程 (UI線程) 中調(diào)用,不能進行耗時操作;
- MAIN_ORDERED:在 Android 中,事件處理方法在主線程 (UI線程) 中調(diào)用。 與 MAIN 不同的是,該事件將始終排隊等待發(fā)布,這確保了事件發(fā)布不會被阻塞;
- BACKGROUND:在 Android 中,事件處理方法在后臺線程中調(diào)用,因此不能進行 UI 操作。如果發(fā)布事件的線程是主線程 (UI線程),那么事件處理函數(shù)將會開啟一個后臺線程,如果果發(fā)布事件的線程是在后臺線程,那么事件處理函數(shù)就使用該線程;
- ASYNC:無論事件發(fā)布的線程是哪一個,事件處理方法始終會新建一個子線程運行,不能進行 UI 操作。
以上便是 EventBus 的最基本的使用,是不是很方便呢。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android實現(xiàn)關(guān)機重啟的方法分享
這篇文章主要介紹了Android實現(xiàn)關(guān)機重啟的方法,需要的朋友可以參考下2014-02-02
android 使用kotlin 實現(xiàn)點擊更換全局語言(中日英切換)
這篇文章主要介紹了android kotlin 點擊更換全局語言的實現(xiàn)方法,這里主要介紹中日英切換,需要的朋友可以參考下2019-11-11
詳解LeakCanary分析內(nèi)存泄露如何實現(xiàn)
這篇文章主要為大家介紹了詳解LeakCanary分析內(nèi)存泄露如何實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12
Android逆向入門之常見Davlik字節(jié)碼解析
Dalvik是Google公司自己設計用于Android平臺的虛擬機。Dalvik虛擬機是Google等廠商合作開發(fā)的Android移動設備平臺的核心組成部分之一,本篇文章我們來詳細解釋常見Davlik字節(jié)碼2021-11-11
Flutter事件監(jiān)聽與EventBus事件的應用詳解
EventBus的核心是基于Streams。它允許偵聽器訂閱事件并允許發(fā)布者觸發(fā)事件,使得不同組件的數(shù)據(jù)不需要一層層傳遞,可以直接通過EventBus實現(xiàn)跨組件通訊2023-04-04

