Android实用开源库-EventBus

作者: 尹star | 来源:发表于2016-03-06 01:43 被阅读877次

    新技能get

    事情是这样的,公司项目还处于一个从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可以作为杀手锏,当其他方案都很不好解决的时候,再亮出来不迟。

    相关文章

      网友评论

      • Ivor0057:之前看过RxJava,现在看到了EventBus,都是基于观察者模式,学习一下~
        话说作者在拷代码的时候最好把空格也带上,不然看起来怪怪的~ :blush:
        尹star:@Ivor0057 post出去的事件各不相同,事件本身就可以用来区别。
        Ivor0057:@尹star 若是post了多个event,有没有requestCode之类的加以区别呢?就像Handler的msg一样的。
        尹star:@Ivor0057 OK 3q :smirk:

      本文标题:Android实用开源库-EventBus

      本文链接:https://www.haomeiwen.com/subject/eahakttx.html