EventBus介绍与使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/king866/article/details/53924489

ps:虽然EventBus是Android中的一款开源框架,但是它确值得任何一个开发者学习


如果你学习过设计模式,那么你一直知道观察者模式。,既然能想到这个设计模式,那么就来看一个Android开源框架EventBus。主要功能是替代Intent、Handler、BroadCast在Activity、Service、线程之间传递消息。学过Android开发的同学一直知道,在Activity和Service之间通信是很困难的事情,还有在开发中Handler是经常使用的通信工具,那么EventBus比Handler更加方便、快、消耗小

不仅仅在安卓开发中,在很多框架中都把eventBus封装在其内部


基础介绍


上面说了,EventBus是一个观察者模式的实现,既然这样,那他就有如下三个要素:
Event:事件
Subscriber:事件订阅者,接收特定的事件。
Publisher:事件发布者,用于通知Subscriber有事件发生。

如图所示

Subscriber首先注册到EventBus上,Publisher则是将事件推到EventBus上,当EventBus收到消息时,会查找相应的订阅者,并触发订阅者响应

看着很简单,但是它的思想是很重要的

当SubCriber注册时也需要把回调接口声明好,在新版本中基于注解实现的


Subscriber回调接口以onEvent开头的4个函数区别:(也可基于注解)

  • onEvent:事件的处理在和事件的发送在相同的线程,所以事件处理时间不应太长,不然影响事件的发送线程。

  • onEventMainThread: 事件的处理会在UI线程中执行。事件处理时间不能太长(在Android开发中主线程也称UI线程,如果该线程阻塞那么程序就会卡死,所以在主线程中不能做长时间的事件处理)

  • onEventBackgroundThread:事件的处理会在一个后台线程中执行。虽然名字是BackgroundThread,事件处理是在后台线程,但事件处理时间还是不应该太长,因为如果发送事件的线程是后台线程,会直接在当前后台线程执行事件;如果当前线程是UI线程,事件会被加到一个队列中,由一个线程依次处理这些事件,如果某个事件处理时间太长,会阻塞后面的事件的派发或处理。

  • onEventAsync:事件处理会在单独的线程中执行,主要用于在后台线程中执行耗时操作,每个事件会开启一个线程,但最好限制线程的数目,否则直接影响系统的性能


首先订阅者注册

 EventBus.getDefault().register(this);  (this也可以理解为当前类对象)

声明回调接口

 public void onEvent(String event){       }

也可以用

@Subscribe(threadMode = ThreadMode.POSTING)

public void  XXX(String XXX)

使用注解后 函数名可以随意


注意参数类型(参数类型可以使用自定义类)

当发布事件时,会根据当前事件参数类型与订阅者回调的接口参数类型做匹配,如果类型一直才会回调该方法

@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessage(MessageEvent event) {  //自定义MessageEvent 

}

发布消息

 EventBus.getDefault().post("test!");

使用默认的EventBus发布事件

最后删除注册

EventBus.getDefault().unregister(this);



问题:

EventBus无法去指定接受者,也就是说只要回调方法的参数类型一致都会去回调,也就是说发布事件后去触发匹配的注册者,

在注册者队列中也有优先级

@Subscribe(priority = 1); 通过该注解可以指定订阅优先级(注解在回调方法上)


可以在某一个订阅者回调方法中去取消对队列后面的发布

public void onEvent(MessageEvent event){

EventBus.getDefault().cancelEventDelivery(event) ; 

}

这样我们也可以灵活的去控制事件的发布



最后:订阅者与发布者思想还有观察者模式使用的很广泛,希望自己有更深的理解


猜你喜欢

转载自blog.csdn.net/king866/article/details/53924489