44、EventBus3的使用

使用步骤:

1.build.gradle添加引用 

compile 'org.greenrobot:eventbus:3.0.0'

2.订阅/解除订阅

 订阅

EventBus.getDefault().register(this);//订阅

 解除订阅

EventBus.getDefault().unregister(this);//解除订阅

3.定义一个事件类型

/**
 * 传递事件实体类(EventBus发送此类事件给订阅者)
 */
public class MessageEvent {
    public String name;
    public MessageEvent(String name) {
        this.name = name;
    }
}

4.发布事件(普通事件)

EventBus.getDefault().post(new MessageEvent(“name”,”password”));

5.订阅事件处理
/**
 * 声明订阅方法:当接收到事件的时候,会调用该方法
 * 使用@Subscribe注解
 * */
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(EventBusMessage msg) {
    Log.d("eventBusThread", "ThreadMode.MAIN " + Thread.currentThread().getName());
}
接收消息:可以有四种线程模型选择
ThreadMode总共四个:
  • NAIN UI主线程
  • BACKGROUND 后台线程
  • POSTING 和发布者处在同一个线程
  • ASYNC 异步线程

加注解提示:在写接收消息的方法是,方法名可以自定义,权限必须是public。

6.终止事件往下传递

 发送有序广播可以终止广播的继续往下传递,EventBus也实现了此功能

EventBus.getDefault().cancelEventDelivery(event) ;//优先级高的订阅者可以终止事件往下传递

 

EventBus黏性事件

上面的普通事件,都是需要先注册(register),再post,才能接受到事件;如果你使用postSticky发送事件,那么可以不需要先注册,也能接受到事件,也就是一个延迟注册的过程。 

通过 postSticky 发送粘性事件,这个事件不会只被消费一次就消失,而是一直存在系统中,知道被 removeStickyEvent 删除掉。那么只要订阅了该粘性事件的所有方法,只要被register 的时候,就会被检测到,并且执行。订阅的方法需要添加 sticky = true 属性。

概念: 黏性事件就是指在EventBus内部被缓存的那些事件

原理: EventBus为每个类(class)类型保存了最近一次被发送的事件——sticky。后续被发送过来的相同类型的sticky事件会自动替换之前缓存的事件。当一个监听者向EventBus进行注册时,它会去请求缓存事件。这时,缓存的事件就会立即自动发送给这个监听者,有一定的延时性.

EventBus除了普通事件也支持粘性事件,这个有点类似广播分类中的粘性广播。本身粘性广播用的就比较少,为了方便理解成订阅在发布事件之后,但同样可以收到事件。订阅/解除订阅和普通事件一样,但是处理订阅函数有所不同,需要注解中添加sticky = true,是启动黏性事件

1

2

3

4

    @Subscribe(threadMode = ThreadMode.MAIN,sticky = true)

    public void EventBusSticky(EventBusStickyMessage eventBusStickyMessage){    

        tv_title.setText(eventBusStickyMessage.message);

    }

@Subscribe(sticky = true),也可以处理普通事件

发送粘性事件

EventBus.getDefault().postSticky(new EventBusStickyMessage()); 

如果不需要黏性事件我们可以移除

//表示如果粘性事件不为空,则手动删除手动获取和删除粘性事件

MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);

if (stickyEvent != null) {
    EventBus.getDefault().removeStickyEvent(stickyEvent);
}

或者调用移除所有粘性事件 

 EventBus.getDefault().removeAllStickyEvents();

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值