美文网首页
初识EventBus

初识EventBus

作者: Noah牛YY | 来源:发表于2018-02-28 00:08 被阅读2次

    What

    发布/订阅事件总线,

    EventBus is an open-source library for Android and Java using the publisher/subscriber pattern for loose coupling. EventBus enables central communication to decoupled classes with just a few lines of code – simplifying the code, removing dependencies, and speeding up app development.

    How

    三要素

    • Event: 事件, 任何类型
    • Subscriber: 订阅者, 消息发布后, 接收消息
    • Publisher: 发布者, 发布消息

    开始使用

    定义事件

    public class MyEvent {
    }
    

    创建订阅者, 在接收事件的方法上贴上注解 @Subscribe, 参数为四种线程模型, 稍后讲到, 方法名称随意, 一般为 onEvent, 参数为订阅的事件.

    public class MyEventSubscribe {
        @Subscribe(threadMode = ThreadMode.ASYNC)
        public void onEvent(MyEvent event){
            // TODO 
        }
    }
    

    订阅者订阅 Event, register 的参数为一个任意类型对象, 这个对象要存在一个方法被 @Subscribe 注解修饰

    EventBus.getDefault().register(Obj);
    

    取消订阅

    EventBus.getDefault().unregister(Obj);
    

    发布事件, post 参数为你定义的事件

    EventBus.getDefault().post(Obj);
    

    粘性事件

    大概就是先发布, 后订阅也能接收到消息

    EventBus 不同于 Handler

    安卓中要注意的一点是, EventBus 的事件执行, 是没接受到一个事件, 如果线程指定为 ThreadMode.ASYNC, 则会新建线程, 而不是复用一个线程, 这一点区分于 Handler, 使用 Handler 是只要一个线程, 存在一个消息队列, 虚幻执行消息

    ThreadMode(线程模型)

    共四种

    • POSTING(默认)

    该事件在哪个线程发布出来的, 事件处理函数就会在这个线程中运行. 在线程模型为 POSTING 的事件处理函数中尽量避免执行耗时操作, 因为它会阻塞事件的传递, 甚至有可能会引起 ANR.

    • MAIN:

    事件的处理会在UI线程中执行. 事件处理时间不能太长, 长了会 ANR 的.

    • BACKGROUND:

    如果事件是在 UI 线程中发布出来的, 那么该事件处理函数就会在新的线程中运行, 如果事件本来就是子线程中发布出来的, 那么该事件处理函数直接在发布事件的线程中执行. 在此事件处理函数中禁止进行 UI 更新操作.

    • ASYNC:

    无论事件在哪个线程发布, 该事件处理函数都会在新建的子线程中执行, 同样, 此事件处理函数中禁止进行UI更新操作.

    相关文章

      网友评论

          本文标题:初识EventBus

          本文链接:https://www.haomeiwen.com/subject/oymvxftx.html