关于EventBus3.0的介绍

来源:互联网 发布:软件的应用价值 编辑:程序博客网 时间:2024/06/06 01:46

EventBus使用观察者模式

EventBus使用方法:

post发送消息的地方:
1.注册:EventBus.getDefault().register(this);一般会在onCreate里。

2.发出通知:EventBus.getDefault().post(new PostEvent("PostEvent"));在使用的地方,任意线程。

3.反注册(注销):EventBus.getDefault().unregister(this);onDestroy里。


消息处理的位置:
1.在接受事件的方法加上修饰符@Subscribe(threadMode = ThreadMode.MAIN, sticky = true, priority = 100)(eg: onMessage(PostEvent event), sticky粘性事件, priority优先级),PostEvent对应于前面的消息对象。

发送消息:
定义一个事件,这个事件一旦被EventBus分发出去就是代表某一件事情发生了,这个事件就是某个观察者关心的事情(不需要继承任何类)

EventBus3.0:
1.提供了EventBusAnnotationProcessor注解处理器来在编译期通过读取@Subscribe()注解并解析、处理其中所包含的信息,
然后生成java类(默认EventBusIndex类在build文件夹中)来保存所有订阅者关于订阅的信息,这样就比在运行时使用反射来获得这些订阅者的信息速度要快。
2.支持注解方式,而且支持注解中设置ThreadMode、sticky事件、优先级。

EventBus处理异步并发消息:
1、ThreadMode.POST:该方法的执行和事件发送者在同一个线程中,适用于对是否在主线程执行无要求的情况,但post线程为主线程,则不能有耗时操作。
2、ThreadMode.MAIN:在主线程执行,不论事件从哪个线程发送过来。
3、ThreadMode.BACKGROUND:如果发送事件的线程不是UI线程,则运行在该线程中。如果发送事件的是UI线程,则它运行在由EventBus维护的一个单独的线程中。多个事件会同步地被这个单独的后台线程所处理。适用于轻微耗时的操作,比如读写数据库。
4、ThreadMode.ASYNC:运行在单独的工作线程中,不论发送事件的线程是否为主线程。跟BackgroundThread不一样,该模式的所有线程是独立的,因此适用于长耗时操作,例如网络访问。

使用Eventbus2.0与3.0的区别
1.EventBus 2.x 必须定义以onEvent开头的几个方法,代码中语境比较突兀,且有可能会导致拼写错误,例如数据同步事件,EventBus  3.0 函数名字不再受到权限,而且可以在一个函数中体现出在哪个线程执行,并且可指定接收事件的优先级
2.EventBus 2.x 注册方式也比较繁琐。EventBus  3.0 注册方式只有一个
3.EventBus 2.x 是采用反射的方式对整个注册的类的所有方法进行扫描来完成注册,当然会有性能上的影响。EventBus 3.0中EventBus提供了EventBusAnnotationProcessor注解处理器来在编译期通过读取@Subscribe()注解并解析、处理其中所包含的信息,然后生成Java类来保存所有订阅者关于订阅的信息,这样就比在运行时使用反射来获得这些订阅者的信息速度要快
4.EventBus 四个Subscriber,ThreadMode 是EventBus中一个很重要的概念,其本身是一个enum,它提供了四个默认属性值:Async,BackgroundThread,MainThread,PostThread;而在3.0中则改为ASYNC,BACKGROUND,MAIN,POSTING。分别对应四个方法。

关于Rxjava和EventBus对比:

EventBus 和 RxJava 的事件通知实现原理都是基于观察者模式的设计思路,但两者在API层面有明显的区别。
区别在于 RxJava 提供了响应式流的编程模型,而EventBus 是通过 post, receive 的方式,为了开发者友好也提供了很多有用的注解和特殊的事件。
本质上都是观察者模式的不同具体实现方式,这是我认为两者最大区别的地方,他们不存在优劣之分,各自适合的应用场景不同而已。
Rx 解决的问题是简化异步编程,以同步的方式编写异步的业务代码,提高代码的维护性和易用性。
就像 Ruby 为了达到人的高度可读性提供极强的动态能力,而导致性能有一些妥协,Rx同样也会存在类似的问题。回到他们出现的初衷,选择哪一个框架,还是需要看应用场景。如果可能的话,两者都用取其长处。

总结:
异步可以使用RxJava,用于取代thread+handler;数据传递和通信使用EventBus,补充 监听器接口(Listener Interface),广播(BroadCastReciver),startActivityForResult()和onActivityResult()方法。

推荐文章:http://www.jianshu.com/p/cb39a0018db1
原创粉丝点击