西部数码主机 | 阿里云主机| 虚拟主机 | 服务器 | 返回乐道官网

Android实用开源库EventBus

时间:2016-03-06 14:44来源:未知 作者:好模板 点击:
事情是这样的,公司项目还处于一个从0到1的过程,一个登录模块,用户登录完了要刷新各种数据,完成各种回调。为了将来好维护,少挖坑,一开始准备使用观察者,这样会比较优雅

事情是这样的,公司项目还处于一个从0到1的过程,一个登录模块,用户登录完了要刷新各种数据,完成各种回调。为了将来好维护,少挖坑,一开始准备使用观察者,这样会比较优雅。但是JAVA的Observer用起来还是不太方便,无奈时间太紧迫,已经做好通宵准备了。旁边的小伙伴提醒用EventBus,粗略的查了下使用方法,依葫芦画瓢,原本很大的工作量,居然秒秒钟就搞定了,EventBus真乃神器,新技能+1。

EventBus简介

原以为EventBus要翻译为“事件车”,查了下这里bus是总线的意思。EventBus是基于JVM内部的数据传输系统,其的核心对象为Event和EventHandler。个人感觉EventBus和android中的BroadCast很像,但是使用起来却要简单的多。例如A、B两个Activity或者Fragment,A中发生了一件事的同时要通知B做出相应的改变,假如A、B存在调用关系,还可以通过intent,handler,或者接口回调等来解决。假如A、B八竿子打不着,也可以用BroadCast来传递消息。但是BroadCast这个方案还是太重了,现在有一个比较轻量级的解决方案:EventBus,几乎可以完成各种类型的事件传递,没有做不到,只有想不到。EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。

使用方法

上面已经说过了,EventBus是基于发布/订阅这一模型来设计的,说的通俗点就是设计模式中的观察者模式。使用也很既简单,整个事件中:被观察者发布消息,观察者订阅消息,收到消息后do something。

事件

首先被观察者和观察者之间约定一个统一的事件,可以理解为信号。这里需要一个类,可以是一个空类

public class Event {  
     public Event(){}  
 }

这样就可以了。

被观察者发布事件

EventBus.getDefault().post(newEvent());

就这一句就可以了,这里其实是个单例,EventBus.getDefault()其源码里就相当于是EventBus.getInstance()

观察者监听事件

1:在观察者页面去接收事件

publicvoidonEvent(Eventevent){}

这个方法不需要你去写调用,就放心大胆的在里面写接收到事件后,你想干的事。

2:在oncreat()或者其他合适的地方注册监听事件

EventBus.getDefault().register(this);

这register(this)是干嘛的呢?其实register(this)就是去当前类,遍历所有的方法,找到onEvent开头的然后进行存储。现在知道onEvent开头的方法是干嘛的了吧。3:解除注册,在ondestroy()或其他合适的地方解除注册

EventBus.getDefault().unregister(this);

以上就是全部的使用方法,有没有很简单,有没有很清晰,有没有很明了,有没有很赞。

高级使用方法

关于onEvent()接收事件的方法,它是在主线程接收的事件,还是在子线程中接收的事件,或者是哪一条子线程接收的事件?EventBus提供了4类接收事件的方法可以满足你的个(bian)性(tai)需求。

onEvent():如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。

onEventMainThread():如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。

onEventBackground():如果使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。

onEventAsync():使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.

其他

有这么一个疑问,假如我的工程里用EventBus发布了很多事件,同时又有很多地方要分别接收这些事件,那么发出的消息和接收的消息是怎么对应的,会不会接收错了?前面已经说过了,被观察者和观察者事先通过约定好的信号找到彼此,EventBus怎么知道要调哪个函数呢,就看哪个函数传进去的参数是这个类的实例,哪个是就调哪个。那如果有两个是呢,那两个都会被调用。我上面的例子里事件是一个空类,而实际使用过程中可以加各种类型的参数来实现数据的传递,有没有很炫酷。

总结

Android中通信的解决方案有很多,具体方案还要根据实际情况来制定。对于新开发者来说最好还是先用用用Handler,startActivityforResult,onNewIntent,Broadcast,Callback的方案体验下Android开发的魅力,EventBus可以作为杀手锏,当其他方案都很不好解决的时候,再亮出来不迟。

(责任编辑:好模板)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
热点内容