EventBus的简单使用

参考文章:https://blog.csdn.net/u012317510/article/details/78935720
简介:EventBus是一种用于Android的发布/订阅事件总线。即一处发布,多处订阅
优点:
* 简化应用组件间的通信
* 解耦事件的发送者和接收者
* 避免复杂和容易出错的依赖和生命周期的问题
* 很快,专门为高性能优化过等等。

,基本使用主要分为3个步骤:
* 定义事件。
* 订阅事件。
* 发布事件。

  • 第一步,定义事件。事件可以是任意普通的Java对象,没有任何特殊的要求
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;
        }
    }
  • 第二步,订阅事件,使用 @Subscribe 注解来定义订阅者方法。方法名可以是任意合法的方法名,参数类型为订阅事件的类型。
//1,注册订阅事件,通常在oncreate方法中:
    EventBus.getDefault().register(this);
//2,注销订阅事件,通常在onDestory方法中:
    EventBus.getDefault().unregister(this);
//3,定义订阅者方法
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEvent(MessageEvent event) {
        string = event.getMessage();
        。。。。
    }
  • 第三步,发布事件。在需要的地方发布事件,所有订阅了该类型事件并已注册的订阅者将收到该事件
// 发布事件
EventBus.getDefault().post(new MessageEvent("Hello EventBus!"));
线程模式:

EventBus支持订阅者方法在不同于发布事件所在线程的线程中被调用。你可以使用线程模式来指定调用订阅者方法的线程。EventBus总共支持5种线程模式:
如上方:@Subscribe(threadMode = ThreadMode.MAIN)

  • ThreadMode.POSTING 订阅者方法将在发布事件所在的线程中被调用。这是 默认的线程模式。
    事件的传递是同步的,一旦发布事件,所有该模式的订阅者方法都将被调用。这种线程
    模式意味着最少的性能开销,因为它避免了线程的切换。因此,对于不要求是主线程并
    且耗时很短的简单任务推荐使用该模式。使用该模式的订阅者方法应该快速返回,以避
    免阻塞发布事件的线程,这可能是主线程。
  • ThreadMode.MAIN 订阅者方法将在主线程(UI线程)中被调用。因此,可以在该模式的订阅
    者方法中直接更新UI界面。如果发布事件的线程是主线程,那么该模式的订阅者方法将
    被直接调用。使用该模式的订阅者方法必须快速返回,以避免阻塞主线程。
  • ThreadMode.MAIN_ORDERED 订阅者方法将在主线程(UI线程)中被调用。因此,可以在该模
    式的订阅者方法中直接更新UI界面。事件将先进入队列然后才发送给订阅者,所以发布
    事件的调用将立即返回。这使得事件的处理保持严格的串行顺序。使用该模式的订阅者
    方法必须快速返回,以避免阻塞主线程。
  • ThreadMode.BACKGROUND 订阅者方法将在后台线程中被调用。如果发布事件的线程不是主线
    程,那么订阅者方法将直接在该线程中被调用。如果发布事件的线程是主线程,那么将
    使用一个单独的后台线程,该线程将按顺序发送所有的事件。使用该模式的订阅者方法
    应该快速返回,以避免阻塞后台线程。
  • ThreadMode.ASYNC 订阅者方法将在一个单独的线程中被调用。因此,发布事件的调用将立即
    返回。如果订阅者方法的执行需要一些时间,例如网络访问,那么就应该使用该模式。
    避免触发大量的长时间运行的订阅者方法,以限制并发线程的数量。EventBus使用了一个
    线程池来有效地重用已经完成调用订阅者方法的线程。
粘性事件:如果先发布了事件,然后有订阅者订阅了该事件,那么除非再次发布该事件,否则订阅者将永远接收不到该事件。此时,可以使用粘性事件。发布一个粘性事件之后,EventBus将在内存中缓存该粘性事件。当有订阅者订阅了该粘性事件,订阅者将接收到该事件。
  • 1,订阅粘性事件
@Subscribe(sticky = true)
public void onMessageEvent(MessageEvent event) {
    ...
}
  • 2,发布粘性事件
EventBus.getDefault().postSticky(new MessageEvent("Hello EventBus!"));

发布一个粘性事件之后,EventBus将一直缓存该粘性事件。如果想要移除粘性事件,那么可以使用如下方法:

// 移除指定的粘性事件
removeStickyEvent(Object event);

// 移除指定类型的粘性事件
removeStickyEvent(Class<T> eventType);

// 移除所有的粘性事件
removeAllStickyEvents();    
事件优先级:EventBus支持在定义订阅者方法时指定事件传递的优先级。默认情况下,订阅者方法的事件传递优先级为0。数值越大,优先级越高。在相同的线程模式下,更高优先级的订阅者方法将优先接收到事件。注意:优先级只有在相同的线程模式下才有效。可以在高优先级的订阅者方法接收到事件之后取消事件的传递。此时,低优先级的订阅者方法将不会接收到该事件。
  • 注意: 订阅者方法只有在线程模式为ThreadMode.POSTING时,才可以取消一个事件的传递。
    当前的线程名:Thread.currentThread().getName()
//指定事件传递优先级:
     @Subscribe(threadMode = ThreadMode.POSTING, priority = 1)
    public void onMessageEvent(MessageEvent event) {
        ...
    }

//取消事件传递:
    @Subscribe(threadMode = ThreadMode.POSTING, priority = 1)
    public void onMessageEvent(MessageEvent event) {
        ...
        // 取消事件传递
        EventBus.getDefault().cancelEventDelivery(event);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值