EventBus使用详解

EventBus

简介:

* 简化Activitys、Fragments、后台线程间的通信

* 避免复杂的和容易出错的依赖和生命周期,注册与解绑

* 使用代码简单

* 性能高

* 处理事件可以随意指定线程


 优点:简化组件之间的通信方式,实现解耦让业务代码更加简洁,可以动态设置事件处理线程以及优先级

 缺点:目前发现唯一的缺点就是类似之前策略模式一样的诟病,每个事件都必须自定义一个事件类,造成事件类太多,无形中加大了维护成本


开始使用EventBus


1.EventBus可以从JCenter和Maven中央仓库获取,所以只需在gradle脚本中添加这个依赖

  compile 'org.greenrobot:eventbus:3.0.0'

2.定义事件

public class MessageEvent {
    private String message;

    public MessageEvent(String message) {
        this.message = message;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
}

3.注册组件(以Activity为例)

  //注册事件
  EventBus.getDefault().register(this);

  一般在onDestroy()中解绑EventBus
  //取消事件注册
  EventBus.getDefault().unregister(this);

4.接收到事件的处理函数 
/**
 * Main
 * 消息处理的方法.在主线程执行函数
 * @param messageEvent
 */
@Subscribe(threadMode = ThreadMode.MAIN)
public void onShowMessageEventMain(MessageEvent messageEvent){
    tv.setText("Message from SecondActivity : " +  messageEvent.getMessage());
    Log.e(TAG ,"--接收messgae:" + messageEvent.getMessage());
    Log.e(TAG ,"--MAIN执行函数所在线程:" + Thread.currentThread().getName());
}
/**
 * Post
 * 发送事件在哪个线程,就在哪个线程执行函数
 * @param messageEvent
 */
@Subscribe(threadMode = ThreadMode.POSTING)
public void onShowMessageEventPost(MessageEvent messageEvent){
    Log.e(TAG ,"--接收messgae:" + messageEvent.getMessage());
    Log.e(TAG ,"--POSTING执行函数所在线程:" + Thread.currentThread().getName());
}
/**
 * Astn
 * 发送事件不管在什么进程,都会新建线程执行函数
 * @param messageEvent
 */
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onShowMessageEventAsyn(MessageEvent messageEvent){
    Log.e(TAG ,"--接收messgae:" + messageEvent.getMessage());
    Log.e(TAG ,"--ASYNC执行函数所在线程:" + Thread.currentThread().getName());
}
/**
 * Background
 * 发送事件在UI线程的话,就会新建线程执行函数,发送事件在子线程的话,就在该子线程中执行函数
 * @param messageEvent
 */
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onShowMessageEventBackground(MessageEvent messageEvent){
    Log.e(TAG ,"--接收messgae:" + messageEvent.getMessage());
    Log.e(TAG ,"--BACKGROUND执行函数所在线程:" + Thread.currentThread().getName());
}


5.发送事件
  EventBus.getDefault().post(new MessageEvent(edit.getText().toString()));
 
事件有一般事件和粘性事件,组件A 和 B ,A注册了事件,并有事件处理函数,但是未指定是粘性函数处理,B中有指定为粘性事件执行的函数;此时B通过postSticky()发送粘性事件,此时会执行A中的处理函数,B因为还没有注册,不会执行粘性函数,点击将B注册事件,此时就会执行B中的粘性事件。假设还有组件C,一旦组件C也注册事件,此时C中的粘性事件的处理函数也会执行,也就说发送的这一个粘性事件,只要有新注册的粘性函数就会执行
,标明是否是粘性函数的标记:sticky=true。

EventBus.getDefault().postSticky(new MessageEvent(edit.getText().toString()));//如果此组件注册为粘性事件,就会发送粘性事件,如果未注册粘性事件就会发送一般的事件
//下面是黏性事件
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void onShowMessageEventMainSticky(MessageEvent messageEvent) {
    Log.e(TAG, "--接收messgae:" + messageEvent.getMessage());
    Log.e(TAG, "--MAIN执行函数所在线程--黏性事件:" + Thread.currentThread().getName());
}
@Subscribe(threadMode = ThreadMode.POSTING, sticky = true)
public void onShowMessageEventPostSticky(MessageEvent messageEvent) {
    Log.e(TAG, "--接收messgae:" + messageEvent.getMessage());
    Log.e(TAG, "--POSTING执行函数所在线程--黏性事件:" + Thread.currentThread().getName());
}
@Subscribe(threadMode = ThreadMode.ASYNC, sticky = true)
public void onShowMessageEventAsynSticky(MessageEvent messageEvent) {
    Log.e(TAG, "--接收messgae:" + messageEvent.getMessage());
    Log.e(TAG, "--ASYNC执行函数所在线程--黏性事件:" + Thread.currentThread().getName());
}
@Subscribe(threadMode = ThreadMode.BACKGROUND, sticky = true)
public void onShowMessageEventBackgroundSticky(MessageEvent messageEvent) {
    Log.e(TAG, "--接收messgae:" + messageEvent.getMessage());
    Log.e(TAG, "--BACKGROUND执行函数所在线程--黏性事件:" + Thread.currentThread().getName());
}

混淆:
#EventBus混淆
-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);
}

更详细的可以看源码

源码传送门

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值