Android中EventBus的使用

EventBus的优点

•       简化组件之间的通信

•       事件发送者和接收者解耦

•       可在Activities、Fragments和后台线程中很好的执行

•       避免复杂、容易出错的依赖关系和生命周期问题

•       使你的代码更简单

•       快速

•       体积小(50k左右)

•       超过100000000 +的应用程序中使用

•       具有先进的功能,如DeliveryThreads、优先级等。

EventBus的角色

•       事件发布者、事件、Eventbus和事件订阅者

EventBus的使用

1.定义消息事件

  publicstatic class MessageEvent { /* Additional fields if needed */ }

2.准备事件订阅者

         a.声明并且使用@Subscribe注解订阅事件

 @Subscribe(threadMode= ThreadMode.MAIN)

         publicvoid onMessageEvent(MessageEvent event) {/* Do something */};

         b.在事件订阅者中注册和注销EventBus,如下:

 @Override

         publicvoid onStart() {

                   super.onStart();

                   EventBus.getDefault().register(this);

         }

         @Override

         publicvoid onStop() {

                   super.onStop();

                   EventBus.getDefault().unregister(this);

         }

3.发布事件

  EventBus.getDefault().post(newMessageEvent());

EventBus的ThreadMode

EventBus中可以通过ThreadMode设置调用事件订阅者的线程。方法如下:

 

ThreadMode: POSTING:无论从那个线程发布的事件,都在该线程中执行。

@Subscribe(threadMode = ThreadMode.POSTING) 

public void onMessageEvent(MessageEventevent) {/* Do something */};

ThreadMode: MAIN:无论从那个线程发布的事件都会在UI线程中执行。

@Subscribe(threadMode = ThreadMode.MAIN) publicvoid onMessageEvent(MessageEvent event) {/* Do something */};

ThreadMode: BACKGROUND:如果事件是从UI线程中发布出来,则在子线程中执行,如果事件本身是从子线程中出来,则仍然在该子线程中执行。

@Subscribe(threadMode = ThreadMode.BACKGROUND) 

public void onMessageEvent(MessageEventevent) {/* Do something */};

ThreadMode: ASYNC:无论事件是从那个线程发布,都会另开一个线程执行,所以该方法永远不会在UI线程中被执行。

@Subscribe(threadMode = ThreadMode.ASYNC) 

public void onMessageEvent(MessageEventevent) {/* Do something */};

EventBus中的配置

1、优先级

Subscribe源码如下:

 public@interface Subscribe {   

         ThreadModethreadMode() default ThreadMode.POSTING;   

         booleansticky() default false;   

         intpriority() default 0;

}

在同一个线程级别中,订阅者的优先级越高,就越先收到消息,默认优先级是0

2、取消事件

EventBus.getDefault().cancelEventDelivery(event) ;  

3、粘性事件

第一步:发送粘性事件

EventBus.getDefault().postSticky(new MessageEvent("Hello everyone!"));  

第二步:声明订阅事件

@Subscribe(sticky = true, threadMode= ThreadMode.MAIN) 
public void onEvent(MessageEvent event)  {

         /*Do something */

};

第三步:注册订阅者

EventBus.getDefault().register(this);  

在注册过程中粘性用户所有方法将立即得到前面贴粘性的事件

第四步:移除粘性事件两种方式

 1.获取粘性事件实例后移除

MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);
// Better check that an event was actually posted before
if(stickyEvent != null) {
// "Consume" the sticky event
EventBus.getDefault().removeStickyEvent(stickyEvent);
// Now do something with it

}

2.直接移除

MessageEvent stickyEvent = EventBus.getDefault().removeStickyEvent(MessageEvent.class);
// Better check that an event was actually posted before
if(stickyEvent != null) {
// Now do something with it
}

4、使用EventBusBuilder配置EventBus

EventBus.builder().logNoSubscriberMessages(false). sendNoSubscriberEvent(false).installDefaultEventBus();

更多配置见源码EventBusBuilder.java

5、混淆配置

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

混淆连接

http://greenrobot.org/eventbus/documentation/proguard

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈德山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值