EventBus的使用

EventBus 是一款在 Android 开发中使用的发布/订阅事件总线框架,基于观察者模式,将事件的接收者和发送者分离,避免复杂且容易出错的依赖关系和生命周期问题,简化了组件之间的通信。
在这里插入图片描述

EventBus的优点

  • 通过ThreadMode方便灵活的指定工作线程
  • 速度快
  • 功能多,使用方便
  • 对事件通信双方进行解耦
  • 简化的组件间交流的方式

使用

  • 在使用之前先将EventBus作为依赖项添加进项目中
    在这里插入图片描述

步骤一:定义事件

创建一个事件类型,消息类型可以是基本数据类型,也可以是自定义的一个事件类

public class MessageEvent {                           
    public String message;                            
                                                      
    public MessageEvent(String message) {             
        this.message = message;                       
    }                                                 
}     
@Override                                      
public String toString() {                     
    return "MessageEvent{" +                   
            "message='" + message + '\'' +     
            '}';                               
}                                                                                              

步骤二:准备订阅者

订阅者实现事件处理方法,在事件发布时即将被调用,通过@Subscribe注释定义。

@Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEvent(MessageEvent event){
        Toast.makeText(this,event.toString(),Toast.LENGTH_LONG).show();
        Log.i("test","onMessageEvent" + event.toString());
    }

用户需要自己注册和注销从总线,只有在注册订户时,他们才能收到事件,通过根据活动和片段的生命周期进行注册,大多数情况下,onStart/onStop可以正常工作

@Override
    protected void onStart() {
        super.onStart();
        EventBus.getDefault().register(this);
    }

    @Override
    protected void onStop() {
        super.onStop();
        EventBus.getDefault().unregister(this);
    }

步骤三:发布活动

MessageEvent event = new MessageEvent("Hello");
EventBus.getDefault().post(event);

传递线程(ThreadMode)

threadMode 用来决定onMessageEvent在那种线程环境下呗调用

  • POSTING :这是EventBus的默认模式,表示post事件是什么线程,onMessageEvent接收事件方法就在同样的线程环境中执行代码
  • MAIN:,无论事件发布在什么线程,事件接收都是在主线程中执行。如果发布者post事件在主线程中的话,会阻塞post事件所在的线程。
  • MAIN_ORDERED:订阅者将在Android的主线程中调用。该事件始终排入队列,以便以后交付给订阅者,因此投递呼叫将立即返回。这使事件处理具有更严格和更一致的顺序(因此名称为MAIN_ORDERED)
  • BACKGROUND:订户将在后台线程中被调用。如果发布线程不是主线程,则将在发布线程中直接调用事件处理程序方法。如果发布线程是主线程,则EventBus使用单个后台线程,该线程将顺序传递其所有事件。
  • ASYNC:事件处理程序方法在单独的线程中调用。

Sticky

sticky是一个boolean型的参数,默认值是false,表示不启用sticky特性。EventBus事件传递的例子的时候,我们都是先对订阅者(Subscriber)进行先注册的,然后再post事件的。那sticky的作用是在先post事件,后对订阅者注册这种开发场景的支持的。

priority

该参数是int型,默认值是0,优先级。在同一传递线程(ThreadMode)中,优先级较高的订户将在其他优先级较低的订户之前接收事件。

取消事件传送

以通过从订户的事件处理方法中调用cancelEventDelivery (对象事件) 来取消事件传递过程 。任何进一步的事件传递将被取消,后续的订阅者将不会接收该事件。

 EventBus.getDefault().cancelEventDelivery(event) ;

事件通常由优先级较高的订户取消。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值