EventBus源碼解析(八)-解惑

一、類圖

閱讀筆者文章的讀者會發(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");
    }
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容