一、類圖
閱讀筆者文章的讀者會發(fā)現(xiàn),筆者的文章中幾乎沒有任何與代碼相關的類圖或者流程圖。按理來說,使用圖文結合的形式來分析源碼,可以使讀者更容易接受,且能更快地掌握。究其原因,還是筆者比較懶,不太愿意去畫這些東西。因此,這里為了讓讀者有個整體的概念,就借用了網(wǎng)友的關于EventBus的詳細類圖,在此對這位網(wǎng)友表示感謝!

EventBus類圖
二、常見錯誤及原因
這一小節(jié),我們來看看使用EventBus時遇到的一些錯誤,并將錯誤發(fā)生的原因梳理出來,便于讀者更好地使用EventBus。
錯誤描述:"Subscriber " + subscriber.getClass() + " already registered to event "+ eventType
原因:該問題是由于在同一個訂閱類里面,重復訂閱了同名且事件類型相同的訂閱方法(以@Subscribe標記)
出現(xiàn)場景:EventBus.getDefault().register(this)寫在Activity A的onStart()方法里,此時從Activity A啟動Activity B,再從Activity B回退到Activity A,則此時又會執(zhí)行Activity A的onStart()方法,導致又執(zhí)行了一遍register操作,進而被認為重復訂閱
解決方法:
1.使用EventBus.getDefault().isRegistered(this)判斷;
2.更換register位置
錯誤描述:"Subscriber to unregister was not registered before: " + subscriber.getClass()
原因:該訂閱類之前沒有注冊過,此時卻要解除注冊,從而引發(fā)該問題
出現(xiàn)場景:注冊與解除注冊沒有在適當位置成對出現(xiàn)
解決方法:注冊與解除注冊成對出現(xiàn)
錯誤描述:"No subscribers registered for event " + eventClass
原因:沒有訂閱該類事件
解決方法:訂閱該類事件
錯誤描述:"Unknown thread mode: " + subscription.subscriberMethod.threadMode
原因:使用了EventBus沒有定義過的線程模式
解決方法:必須使用EventBus提供的線程模式
當調用cancelEventDelivery方法時,可能拋出如下四個異常,致使程序崩潰。請讀者正視,該方法主要是用于高優(yōu)先級的訂閱方法里取消事件向低優(yōu)先級訂閱方法的傳遞,且只能在POSTING線程模式下使用,切忌濫用?。。『竺鏁o出使用范例。
錯誤描述:This method may only be called from inside event handling methods on the posting thread
原因:沒有在訂閱方法里調用cancelEventDelivery
解決方法:必須在訂閱方法里面調用cancelEventDelivery
錯誤描述:Event may not be null
原因:cancelEventDelivery在訂閱方法里調用了,但是訂閱方法將事件設置成了null,導致cancelEventDelivery接收到null參數(shù)
解決:確保傳遞給cancelEventDelivery的參數(shù)非null
錯誤描述:Only the currently handled event may be aborted
原因:cancelEventDelivery在訂閱方法里調用了,但參數(shù)并非訂閱方法傳進來的事件對象,而是其他對象
解決方法:確保要取消的事件是當前正在被處理的事件
錯誤描述:event handlers may only abort the incoming event
原因:cancelEventDelivery調用時所處的訂閱方法的線程模式不是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");
}