美文网首页
利用EventBus进行消息传递

利用EventBus进行消息传递

作者: RoboyCore | 来源:发表于2018-08-26 16:01 被阅读74次

    EventBus是什么?

    simplifies the communication between components decouples event senders and receivers performs well with Activities, Fragments, and background threads avoids complex and error-prone dependencies and life cycle issues
    大概意思就是 基于观察者模式的使用,通过模块化解耦方式进行数据化传递。

    Eventbus好用之处在于体积轻便,只有50k左右,而且模块化数据传递解耦,并且可以设置实现所处的线程,也可以发送粘性事件来提前缓存事件

    使用EventBus

    通过引用gradle依赖,目前最新3.1.1 20k star

      implementation 'org.greenrobot:eventbus:3.1.1'
    
    使用EventBus配置

    EventBusBuilder用于设置EventBus的Config信息。比如设置EventBus,防止发送的事件没有订阅者:

      EventBus eventBus = EventBus.builder()
      .logNoSubscriberMessages(false)
      .sendNoSubscriberEvent(false).build();
    

    另一个例子是失败时订阅者抛出异常。注意,EventBus 默认是捕获onEvent方法抛出的异常并且会发送一个可能没有被处理的事件

      EventBus eventBus = EventBus.builder().throwSubscriberException(true).build();
    

    1.发送数据
    EventBus.getDefault().post(Obj);//根据传递的类型发送实体数据、如果传递相同实体类数据到其他地方,需要设置标记
    2.接收方需要注册

    EventBus.getDefault().register(this);
    3.声明一个公共方法接收实体类

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEvent(Obj event) {
    Toast.makeText(getActivity(), event.message,   Toast.LENGTH_SHORT).show();
    }
    

    Obj如果传递到多个地方需要设置标记,根据标记判断
    获取数据不仅需要订阅还需要申明注解Subscribe、必须申明线程模式

    threadMode

    比如Mian(主线程)
    Async(由线程池控制、一般都是长时间耗时操作)
    background(子线程执行,如果发布是子线程就在发布方线程)
    postThread(发送方的线程,如果发送是主线程就不能执行耗时)

    可以设置优先级和是否粘性

    4.粘性事件(发送数据可以暂时不提供观察者、而是存储起来等到需要接收时申请订阅来得到数据)

    EventBus.getDefault().postSticky(Obj);
    EventBus.getDefault().registerSticky(this);//注册
    
    EventBus.getDefault().unregister(this);//取消注册
    

    我们也可以来获取指定类型的sticky事件

    EventBus.getDefault().getStickyEvent(Class<?> eventType)
    

    防止混淆ProGuard

    -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);
    }

    相关文章

      网友评论

          本文标题:利用EventBus进行消息传递

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