EventBus源码解析(八)-解惑

一、类图

阅读笔者文章的读者会发现,笔者的文章中几乎没有任何与代码相关的类图或者流程图。按理来说,使用图文结合的形式来分析源码,可以使读者更容易接受,且能更快地掌握。究其原因,还是笔者比较懒,不太愿意去画这些东西。因此,这里为了让读者有个整体的概念,就借用了网友的关于EventBus的详细类图,在此对这位网友表示感谢!


EventBus类图

二、常见错误及原因

这一小节,我们来看看使用EventBus时遇到的一些错误,并将错误发生的原因梳理出来,便于读者更好地使用EventBus。

错误描述:"Subscriber " + subscriber.getClass() + " already registered to event "+ eventType

原因:该问题是由于在同一个订阅类里面,重复订阅了同名且事件类型相同的订阅方法(以@Subscribe标记)

出现场景:EventBus.getDefault().register(this)写在Activity A的onStart()方法里,此时从Activity A启动Activity B,再从Activity B回退到Activity A,则此时又会执行Activity A的onStart()方法,导致又执行了一遍register操作,进而被认为重复订阅

解决方法:
1.使用EventBus.getDefault().isRegistered(this)判断;
2.更换register位置
错误描述:"Subscriber to unregister was not registered before: " + subscriber.getClass()

原因:该订阅类之前没有注册过,此时却要解除注册,从而引发该问题

出现场景:注册与解除注册没有在适当位置成对出现

解决方法:注册与解除注册成对出现
错误描述:"No subscribers registered for event " + eventClass

原因:没有订阅该类事件

解决方法:订阅该类事件
错误描述:"Unknown thread mode: " + subscription.subscriberMethod.threadMode

原因:使用了EventBus没有定义过的线程模式

解决方法:必须使用EventBus提供的线程模式

当调用cancelEventDelivery方法时,可能抛出如下四个异常,致使程序崩溃。请读者正视,该方法主要是用于高优先级的订阅方法里取消事件向低优先级订阅方法的传递,且只能在POSTING线程模式下使用,切忌滥用!!!后面会给出使用范例。


错误描述: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参数

解决:确保传递给cancelEventDelivery的参数非null
错误描述:Only the currently handled event may be aborted

原因:cancelEventDelivery在订阅方法里调用了,但参数并非订阅方法传进来的事件对象,而是其他对象

解决方法:确保要取消的事件是当前正在被处理的事件
错误描述:event handlers may only abort the incoming event

原因:cancelEventDelivery调用时所处的订阅方法的线程模式不是Posting

解决方法:cancelEventDelivery必须在Posting线程模式的订阅方法里执行

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");
    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容