EventBus源碼解析(八)-解惑

一鹃答、類圖

閱讀筆者文章的讀者會(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");
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末膏燕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子悟民,更是在濱河造成了極大的恐慌坝辫,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逾雄,死亡現(xiàn)場(chǎng)離奇詭異阀溶,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)鸦泳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)永品,“玉大人做鹰,你說(shuō)我怎么就攤上這事《悖” “怎么了钾麸?”我有些...
    開(kāi)封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)炕桨。 經(jīng)常有香客問(wèn)我饭尝,道長(zhǎng),這世上最難降的妖魔是什么献宫? 我笑而不...
    開(kāi)封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任钥平,我火速辦了婚禮,結(jié)果婚禮上姊途,老公的妹妹穿的比我還像新娘涉瘾。我一直安慰自己,他們只是感情好捷兰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布立叛。 她就那樣靜靜地躺著,像睡著了一般贡茅。 火紅的嫁衣襯著肌膚如雪秘蛇。 梳的紋絲不亂的頭發(fā)上其做,一...
    開(kāi)封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音赁还,去河邊找鬼妖泄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛秽浇,可吹牛的內(nèi)容都是我干的浮庐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼柬焕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼审残!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起斑举,我...
    開(kāi)封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤搅轿,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后富玷,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體璧坟,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年赎懦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雀鹃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡励两,死狀恐怖黎茎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情当悔,我是刑警寧澤傅瞻,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站盲憎,受9級(jí)特大地震影響嗅骄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜饼疙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一溺森、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宏多,春花似錦儿惫、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至更胖,卻和暖如春铛铁,著一層夾襖步出監(jiān)牢的瞬間隔显,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工饵逐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留括眠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓倍权,卻偏偏與公主長(zhǎng)得像掷豺,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子薄声,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容