詳解EventBus 3.x 的快速使用
EventBus 可以很方便地進(jìn)行各組件間的通信,解耦性更強(qiáng),比廣播更好用。
EventBus 3 簡(jiǎn)介
EventBus是一種為了優(yōu)化Android組件之間事件傳遞的解耦工具,通過(guò)發(fā)布/訂閱事件總線來(lái)實(shí)現(xiàn)事件在不同組件之間的事件傳遞。
在EventBus 3之前,greenrobot團(tuán)隊(duì)因?yàn)榭紤]性能原因所以比較抵觸使用注解框架。目前的EventBus3開(kāi)始使用注解來(lái)申明訂閱事件的處理方法。雖然目前Android 6 和ART都有了,但是對(duì)于Java反射造成的性能影響還是沒(méi)能很好的解決。
在EventBus3中,greenrobot團(tuán)隊(duì)通過(guò)利用在編譯時(shí)檢索所有注解代碼,然后生成一個(gè)包含所有在運(yùn)行時(shí)要花很大代價(jià)才能獲取的數(shù)據(jù)的類(lèi),通過(guò)這種新的注解處理方式來(lái)提升性能,讓EventBus3比其他的eventbus會(huì)更加快。在后文中會(huì)貼出和otto的性能比較。
EventBus 3 和 EventBus 2.x 的區(qū)別
回調(diào)方法改動(dòng)
由于API的改動(dòng),會(huì)導(dǎo)致EventBus3和之前使用老版本的EventBus不兼容,因?yàn)橹鞍姹荆‥ventBus 2.x),在注冊(cè)完事件之后,會(huì)要求寫(xiě)相應(yīng) onEvent()方法,包括onEvent()、onEventAsync()、onEventBackground()、onEventMainThread() 分別對(duì)應(yīng) @Subscrible 、@Subscrible(threadMode = ThreadMode.ASYNC)、@Subscribe(threadMode = ThreadMode.BACKGROUND)、@Subscribe(threadMode = ThreadMode.MAIN) 。EventBus 3中在未聲明threadMob時(shí),默認(rèn)的線程模式為T(mén)hreadMode.POSTING。
異常容錯(cuò)處理
在EventBus3中,如果在@Subscrible標(biāo)注的方法中,如果程序出錯(cuò),不會(huì)立即使程序crash,而是由EventBus攔截異常,并打印錯(cuò)誤日志。
用戶可以通過(guò)EventBusBuilder來(lái)配置獲取EventBus實(shí)例后的對(duì)象,來(lái)決定在處理event時(shí)是否需要拋出異常信息:
eventBus = EventBus.builder().sendNoSubscriberEvent(false)
.sendSubscriberExceptionEvent(false)
.throwSubscriberException(BuildConfig.DEBUG) //只有在debug模式下,會(huì)拋出錯(cuò)誤異常
.build();
以上代碼使用Builder設(shè)計(jì)模式,來(lái)構(gòu)建返回一個(gè)eventBus實(shí)例。在調(diào)試階段,可以在程序出現(xiàn)異常時(shí)直接Crash發(fā)現(xiàn)錯(cuò)誤。
快速使用
1. 編譯
compile 'org.greenrobot:eventbus:3.1.1'
2. 自定義事件類(lèi)
public class MessageEvent {
// 成員變量根據(jù)自己的需求創(chuàng)建
private int type;
// 通過(guò)構(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. 注冊(cè)事件與解除注冊(cè)
一般來(lái)說(shuō),在 OnCreate() 方法中進(jìn)行注冊(cè):
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_layout);
EventBus.getDefault().register(this);
}
與之對(duì)應(yīng)的,在 OnDestroy() 中解除注冊(cè):
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
4. 發(fā)送事件
EventBus.getDefault().post(new MessageEvent(type));
5. 接收與處理事件
/**
* @Subscribe 注解必須要寫(xiě),線程需要指定
* 方法名可隨意
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
switch (event.getType()){
// do your thing
}
}
上面提到了線程模型,它一共有 5 種:
- POSTING(默認(rèn)): 事件處理方法的線程跟發(fā)布事件的線程是同一個(gè)線程;
- MAIN:在 Android 中,事件處理方法在主線程 (UI線程) 中調(diào)用,不能進(jìn)行耗時(shí)操作;
- MAIN_ORDERED:在 Android 中,事件處理方法在主線程 (UI線程) 中調(diào)用。 與 MAIN 不同的是,該事件將始終排隊(duì)等待發(fā)布,這確保了事件發(fā)布不會(huì)被阻塞;
- BACKGROUND:在 Android 中,事件處理方法在后臺(tái)線程中調(diào)用,因此不能進(jìn)行 UI 操作。如果發(fā)布事件的線程是主線程 (UI線程),那么事件處理函數(shù)將會(huì)開(kāi)啟一個(gè)后臺(tái)線程,如果果發(fā)布事件的線程是在后臺(tái)線程,那么事件處理函數(shù)就使用該線程;
- ASYNC:無(wú)論事件發(fā)布的線程是哪一個(gè),事件處理方法始終會(huì)新建一個(gè)子線程運(yùn)行,不能進(jìn)行 UI 操作。
以上便是 EventBus 的最基本的使用,是不是很方便呢。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android編程實(shí)現(xiàn)兩個(gè)Activity之間共享數(shù)據(jù)及互相訪問(wèn)的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)兩個(gè)Activity之間共享數(shù)據(jù)及互相訪問(wèn)的方法,簡(jiǎn)單分析了Android中Activity數(shù)據(jù)共享與訪問(wèn)的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11
簡(jiǎn)單實(shí)現(xiàn)Android讀取網(wǎng)絡(luò)圖片到本地
這篇文章主要為大家詳細(xì)介紹了如何簡(jiǎn)單實(shí)現(xiàn)Android讀取網(wǎng)絡(luò)圖片到本地的方法,感興趣的小伙伴們可以參考一下2016-08-08
Android EditText限制輸入字?jǐn)?shù)的方法
這篇文章主要介紹了Android EditText限制輸入字?jǐn)?shù)的方法,涉及Android針對(duì)EditText文本與字符串操作相關(guān)技巧,需要的朋友可以參考下2016-01-01
Android webview用法實(shí)例簡(jiǎn)析
這篇文章主要介紹了Android webview用法,結(jié)合實(shí)例形式簡(jiǎn)單分析了Android中webview的功能、用法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-01-01
Android studio開(kāi)發(fā)小型對(duì)話機(jī)器人app(實(shí)例代碼)
這篇文章主要介紹了Android studio開(kāi)發(fā)一個(gè)小型對(duì)話機(jī)器人app,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
探討Android 的屏幕滾動(dòng)操作不如 iPhone 流暢順滑的原因
雖然很多Android手機(jī)的配置都比iPhone要高,比如大多數(shù)Andorid手機(jī)的內(nèi)存都有1GB,而iPhone 4S只有512MB內(nèi)存,但用過(guò)iPhone的人都知道Android手機(jī)在使用的時(shí)候總感覺(jué)沒(méi)有那么順滑,究竟為什么會(huì)出現(xiàn)這種現(xiàn)象呢?2014-07-07
Android入門(mén)教程之Vibrator(振動(dòng)器)
本節(jié)我們介紹的是Vibrator(振動(dòng)器),是手機(jī)自帶的振動(dòng)器,其實(shí)就是Android給我們提供的用于機(jī)身震動(dòng)的一個(gè)服務(wù)!當(dāng)收到推送消息的時(shí)候我們可以設(shè)置震動(dòng)提醒。2016-07-07
Android Webview與ScrollView的滾動(dòng)兼容及留白處理的方法
本篇文章主要介紹了Android Webview與ScrollView的滾動(dòng)兼容及留白處理的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11

