• EventBus3 简单使用及注意点


    博客: 安卓之家
    微博: 追风917
    CSDN: 蒋朋的家
    简书: 追风917

    每日一景

    EventBus3 简介


    EventBus Android 发布/订阅事件总线,可简化 Activities, Fragments, Threads, Services 等组件间的消息传递,可替代 Intent, Handler, BroadCast ,接口等传统方案,更快,代码更小,50K 左右的 jar 包,代码更优雅,彻底解耦。EventBus3 是最新版本,官网地址:

    https://github.com/greenrobot/EventBus

    使用


    这里简单介绍下使用方法:

    1 添加依赖 compile 'org.greenrobot:eventbus:3.0.0'

    2 编写事件类

    3 post 发布事件

    这里有直接发布和滞留发布

    //直接发布
    EventBus.getDefault().post("直接发布");
    //滞留发布
    EventBus.getDefault().postSticky("滞留发布");
    

    注意可以发布的是一个 Object 类,发送什么,订阅者就会接收什么。

    此处要注意两个地方:

    1. 如果 post 字节数据,此时订阅者的方法里参数需为 Byte,而不是 byte,同样的,post int数据,订阅方法参数需为 Interger,其他基本数据类型同理

    2. 如果 post 字符串,那么所有方法的参数是 String 类型的订阅者都会接收到事件而执行方法。

    4 订阅者接收事件

    订阅的时候要注册和取消注册。

    注册一般是在 onCreateonStart 里注册,尽量不要在 onResume,可能出现多次注册的情况,比如下面这个异常::

    EventBusException: Subscriber class already registered to event class
    

    可以先判断下:

        if (!EventBus.getDefault().isRegistered(this)) {
            EventBus.getDefault().register(this);
        }
    

    参看这里:GreenRobot EventBusException: Subscriber class already registered to event class

    取消注册 要写到 onDestroy 方法里,不要写到 onStop 里,有时会出现异常的哦

    EventBus 3 和之前版本的 EventBus 不兼容,这里采用注解的方法来接收事件,四种注解 @Subscrible@Subscrible(threadMode = ThreadMode.ASYNC)@Subscribe(threadMode = ThreadMode.BACKGROUND)@Subscribe(threadMode = ThreadMode.MAIN) 分别对应之前的 onEvent()onEventAsync()onEventBackground()onEventMainThread()

    EventBus 3 采用注解后,方法名没有限制了,参数只有一个,和发送者 post 的参数对应配对,在未声明 threadMode 时,默认的线程模式为 ThreadMode.POSTING,只有在该模式下才可以取消线程,否则容易导致如下异常:

    org.greenrobot.eventbus.EventBusException: This method may only be called from inside event handling methods on the posting thread
    

    由于可在任何地方都可以 post 一个事件,那么在不同线程之间传递事件,比如在工作线程传递一个事件更新UI线程中的一个控件,则需要注意 threadMode 的切换。

    好了,基本使用大概就这些,后面遇到会补充...

    2016.07.13补充:

    今天遇到了订阅事件无法执行的情况,分析后发现是订阅事件的 Activity 还未执行的原因。

    找到原因就好办了,这时候就需要用到 postSticky

    发布事件时用 postSticky 操作:

    EventBus.getDefault().postSticky(event);
    

    订阅时,添加 sticky = true

    @Subscribe(sticky = true)    //看下 `@Subscribe` 源码知道 `sticky` 默认是 `false`
    public void onEvent(Event e) { 
        ---
    }  
    

    这里也有个坑,就是 EventBus.getDefault().register(this); 注册时最好放到各变量初始化最后,否则可能会出现一些变量空指针异常。

    混淆


    没什么说的,复制下面代码到你的混淆文件即可:

    -keepattributes *Annotation*
    -keepclassmembers class ** {    
        @org.greenrobot.eventbus.Subscribe <methods>;
    }
    -keep enum org.greenrobot.eventbus.ThreadMode { 
          *; 
    }
    # Only required if you use AsyncExecutor
    -keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {    
        <init>(java.lang.Throwable);
    }
    

    发布的事件多了以后,我们很难去管理,下面推荐个 AS 插件:

    https://github.com/kgmyshin/eventbus3-intellij-plugin

    更多 AS 插件请访问:https://github.com/jp1017/AndroidStudioPlugins

    欲知更多 EventBus 的内容,还可参考:

    EventBus3新特性及用法
    EventBus 源码解析
    Android EventBus源码解析 带你深入理解EventBus

    最后,非常感谢您的阅读,有任何疑问,可以后面评论,谢谢!

    神奇的安卓开发网站:http://androidcat.com/

    安卓开源库收集整理:https://github.com/XXApple/AndroidLibs

    分享是一种美德,更是一种生活方式!!

    也许你会说我是一个梦想者,但我不是唯一的一个。

    悦分享,越快乐_

    欢迎交流,转载请注明出处,谢谢!

  • 相关阅读:
    OOP & Pointer: Segment Tree
    ICPC_2020 上海站
    Notes: Kirchhoff's Matrix 基尔霍夫矩阵
    CS61A Homework: Church Numerals
    题解:[COCI2011-2012#5] BLOKOVI
    题解:SDOI2017 新生舞会
    题解:POI2012 Salaries
    题解:洛谷P1357 花园
    题解:CF593D Happy Tree Party
    题解 P2320 【[HNOI2006]鬼谷子的钱袋】
  • 原文地址:https://www.cnblogs.com/jp1017/p/5668257.html
Copyright © 2020-2023  润新知