EventBus依赖库:
compile 'org.greenrobot:eventbus:3.0.0'
EventBus主要角色:
l Event 传递的事件对象
l Subscriber 事件的订阅者
l Publisher 事件的发布者
l ThreadMode 定义函数在何种线程中执行
角色的协作图
基本使用:
1. 首先在接收消息的方法中注册EventBUs:
// EventBus.getDefault().register(this);
2. 然后创建方法来接受接收和处理事件:
@Subscribe
public voidgetEventData(FirstEvent event){}
3. 在onDestry()方法中注销EventBus
EventBus.getDefault().unregister(this);
4. 发送消息
EventBus.getDefault().post(newFirstEvent(“张三”,20));
粘性事件使用:
在注册之前可以使用:EventBus.getDefaule().postSticky(newFirstEvent(“李四”,19));
Sticky=true才可以接收消息.
@Subscribe(Sticky=true)//这个必须存在,不然程序会崩,或接收不到消息
public voidgetEventData(FirstEvent event){}
获取和删除粘性事件
MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);
// 判断此粘性事件是否存在
if(stickyEvent != null) {
// 若粘性事件存在,将其删除
EventBus.getDefault().removeStickyEvent(stickyEvent);
}
//取消全部的粘性广播
EventBus.getDefault().removeAllStickyEvents()
设置优先级(粘性事件没有优先级)
@Subscribe(priority = 100)
public void onEvent(MessageEvent event) {
}
// 取消分发的事件(只有在POSTING线程在才能取消事件,且只能用于取消非粘性事件)
EventBus.getDefault().cancelEventDelivery(event) ;
ThreadMode的使用
@Subscribe(threadMode= ThreadMode.MainThread) //在ui线程执行
public void onUserEvent(UserEvent event) { }
BackgroundThread和Async区别
BackgroundThread中的任务,一个接着一个去调用,中间使用了一个布尔型变量handlerActive进行的控制。会阻塞线程.
Async则会动态控制并发。
EventBus3.0要点:
1、接受的地方需要注册和解注册
2、发送的Bean类自己定义,要传哪些字段也自己在Bean中定义
3、EventBus3.0,接受消息的方法自己命名就可以,参数是自己要接受的EventBean,但是必须加注解@subscribe
4、同一个类中,保证同一个EventBean只有一个接受方法,不然会接受错乱
5、粘性广播,如果 @subscribe (stricky = true ) 把sticky设置成ture ,在你注册的一瞬间就会接收到粘性消息 (注意在注册之前就先把将相关的对象实例化,因为接受是很快的,甚至来不及findviewById,不设置stricky = true的话默认不接受粘性广播);
6、EventBus接受消息的地方可以设置ThreadMode;
有四种ThreadMode, 默认情况,和发送事件在同一个线程
//主线程中执行
@Subscribe(threadMode = ThreadMode.MainThread)
//后台线程 (如果发送线程就是子线程的话,当前线程就是发送线程,如果不是的话,就新建一个子线程)
@Subscribe(threadMode =ThreadMode.BackgroundThread)
//强制后台执行 (每次都是开启新的线程)
@Subscribe(threadMode = ThreadMode.Async)
//默认情况,和发送事件在同一个线程
@Subscribe(threadMode =ThreadMode.PostThread)
添加processor
按照Markus Junginger的说法(EventBus创作者),在3.0中,如果你想进一步提升你的app的性能,你需要添加:
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = [ eventBusIndex : 'com.bandeng.MyEventBusIndex' ]
}
优缺点:
1. EventBus是greenrobot公司出的另一款开源框架,这个框架是针对Android优化的发布/订阅事件总线,使用EventBus可以极大的减少我们程序的耦合度。
2. 调度灵活。不依赖于 Context,使用时无需像广播一样关注 Context 的注入与传递。
3. 使用简单。
4. 快速且轻量。
5. 完全解耦了请求链之间的关系,避免了请求者被长持有,
6. 比广播更轻量
7. 可以定义在调用线程、主线程、后台线程、异步。
缺点
8. 各种Event的定义工作量大。每次传的内容不一样,就需要重新定义一个JavaBean
9. 3.0之前限定了方法名(3.0已经可以自定义方法名)
自拟面试题:
10. 说说你对EventBus的了解:
以往咱们在Fragment或Activity之间传值的时候,有时候可能用一些静态方法,比较占用内存,容易造成oom,EventBus,它把注册,发送,接收的方法都封装的很简洁,相对于以往的广播,观察者,接口回调等,使用起来更加方便;传送的内容,是根据自定义的JavaBean来生成,需要传什么内容,就在Javabean创建什么属性,使用起来更加方便,随意,实用性很高,而且耦合度很低,不会浪费内存!
11. 说说你对EventBus3.0比2.x和优势
EventBus 2.x 是采用反射的方式对整个注册的类的所有方法进行扫描来完成注册,当然会有性能上的影响。EventBus 3.0中EventBus提供了EventBusAnnotationProcessor注解处理器来在编译期通过读取@Subscribe()注解并解析、处理其中所包含的信息,然后生成java类来保存所有订阅者关于订阅的信息,这样就比在运行时使用反射来获得这些订阅者的信息速度要快
//简单使用
http://blog.csdn.net/qq_35045932/article/details/53130317
//大神深入讲解
http://blog.csdn.net/io_field/article/details/52185717
常见Bug:
粘性事件使用的时候:先寻找控件,然后再注册EventBus接受消息,否则会造成控件空指针有异常.
Logger依赖库:
compile 'com.orhanobut:logger:1.15'