利用EventBus进行消息传递

2018-08-26  本文已影响74人  RoboyCore

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);
}
上一篇下一篇

猜你喜欢

热点阅读