一鹃答、類圖
閱讀筆者文章的讀者會(huì)發(fā)現(xiàn)干厚,筆者的文章中幾乎沒(méi)有任何與代碼相關(guān)的類圖或者流程圖李滴。按理來(lái)說(shuō),使用圖文結(jié)合的形式來(lái)分析源碼蛮瞄,可以使讀者更容易接受所坯,且能更快地掌握。究其原因挂捅,還是筆者比較懶芹助,不太愿意去畫這些東西。因此闲先,這里為了讓讀者有個(gè)整體的概念状土,就借用了網(wǎng)友的關(guān)于EventBus的詳細(xì)類圖,在此對(duì)這位網(wǎng)友表示感謝伺糠!
EventBus類圖
二蒙谓、常見(jiàn)錯(cuò)誤及原因
這一小節(jié),我們來(lái)看看使用EventBus時(shí)遇到的一些錯(cuò)誤训桶,并將錯(cuò)誤發(fā)生的原因梳理出來(lái)累驮,便于讀者更好地使用EventBus。
錯(cuò)誤描述:"Subscriber " + subscriber.getClass() + " already registered to event "+ eventType
原因:該問(wèn)題是由于在同一個(gè)訂閱類里面渊迁,重復(fù)訂閱了同名且事件類型相同的訂閱方法(以@Subscribe標(biāo)記)
出現(xiàn)場(chǎng)景:EventBus.getDefault().register(this)寫在Activity A的onStart()方法里慰照,此時(shí)從Activity A啟動(dòng)Activity B,再?gòu)腁ctivity B回退到Activity A琉朽,則此時(shí)又會(huì)執(zhí)行Activity A的onStart()方法毒租,導(dǎo)致又執(zhí)行了一遍register操作,進(jìn)而被認(rèn)為重復(fù)訂閱
解決方法:
1.使用EventBus.getDefault().isRegistered(this)判斷箱叁;
2.更換register位置
錯(cuò)誤描述:"Subscriber to unregister was not registered before: " + subscriber.getClass()
原因:該訂閱類之前沒(méi)有注冊(cè)過(guò)墅垮,此時(shí)卻要解除注冊(cè),從而引發(fā)該問(wèn)題
出現(xiàn)場(chǎng)景:注冊(cè)與解除注冊(cè)沒(méi)有在適當(dāng)位置成對(duì)出現(xiàn)
解決方法:注冊(cè)與解除注冊(cè)成對(duì)出現(xiàn)
錯(cuò)誤描述:"No subscribers registered for event " + eventClass
原因:沒(méi)有訂閱該類事件
解決方法:訂閱該類事件
錯(cuò)誤描述:"Unknown thread mode: " + subscription.subscriberMethod.threadMode
原因:使用了EventBus沒(méi)有定義過(guò)的線程模式
解決方法:必須使用EventBus提供的線程模式
當(dāng)調(diào)用cancelEventDelivery方法時(shí)耕漱,可能拋出如下四個(gè)異常算色,致使程序崩潰。請(qǐng)讀者正視螟够,該方法主要是用于高優(yōu)先級(jí)的訂閱方法里取消事件向低優(yōu)先級(jí)訂閱方法的傳遞灾梦,且只能在POSTING線程模式下使用峡钓,切忌濫用!H艉印能岩!后面會(huì)給出使用范例。
錯(cuò)誤描述:This method may only be called from inside event handling methods on the posting thread
原因:沒(méi)有在訂閱方法里調(diào)用cancelEventDelivery
解決方法:必須在訂閱方法里面調(diào)用cancelEventDelivery
錯(cuò)誤描述:Event may not be null
原因:cancelEventDelivery在訂閱方法里調(diào)用了萧福,但是訂閱方法將事件設(shè)置成了null拉鹃,導(dǎo)致cancelEventDelivery接收到null參數(shù)
解決:確保傳遞給cancelEventDelivery的參數(shù)非null
錯(cuò)誤描述:Only the currently handled event may be aborted
原因:cancelEventDelivery在訂閱方法里調(diào)用了,但參數(shù)并非訂閱方法傳進(jìn)來(lái)的事件對(duì)象鲫忍,而是其他對(duì)象
解決方法:確保要取消的事件是當(dāng)前正在被處理的事件
錯(cuò)誤描述:event handlers may only abort the incoming event
原因:cancelEventDelivery調(diào)用時(shí)所處的訂閱方法的線程模式不是Posting
解決方法:cancelEventDelivery必須在Posting線程模式的訂閱方法里執(zhí)行
cancelEventDelivery使用范例如下:
class Event {
}
---------------------------------------------------------------------------------------------------------------------
Event event = new Event();
---------------------------------------------------------------------------------------------------------------------
@Subscribe(threadMode = ThreadMode.Posting, priority = 1000)
public void onEventHigh(Event event) {
Log.d("CancelTest", "subscribe high");
try {
EventBus.getDefault().cancelEventDelivery(event);
} catch (EventBusException e) {
Log.e("Test", e.getMessage());
}
}
@Subscribe(threadMode = ThreadMode.Posting, priority = 100)
public void onEventLow(Event event) {
Log.d("CancelTest", "subscribe low");
}