EventBus的基本使用和一些自拟面试题

EventBus依赖库:
implementation ‘org.greenrobot:eventbus:3.1.1’

EventBus主要角色:
Event 传递的事件对象
Subscriber 事件的订阅者
Publisher 事件的发布者
ThreadMode 定义函数在何种线程中执行
角色的协作图

基本使用:

  1. 首先在接收消息的方法中注册EventBUs:
    // EventBus.getDefault().register(this);
  2. 然后创建方法来接受接收和处理事件:
    @Subscribe
    public void getEventData(FirstEvent event){}
  3. 在onDestry()方法中注销EventBus
    EventBus.getDefault().unregister(this);
  4. 发送消息
    EventBus.getDefault().post(new FirstEvent(“张三”,20));
    粘性事件使用:
    在注册之前可以使用:EventBus.getDefaule().postSticky(new FirstEvent(“李四”,19));
    Sticky=true才可以接收消息.
    @Subscribe (Sticky=true)//这个必须存在,不然程序会崩,或接收不到消息
    public void getEventData(FirstEvent event){}
    获取和删除粘性事件
    MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);
    // 判断此粘性事件是否存在
    if(stickyEvent != null) {
    // 若粘性事件存在,将其删除
    EventBus.getDefault().removeStickyEvent(stickyEvent);
    }
    //取消全部的粘性广播
    EventBus.getDefault().removeAllStickyEvents()

设置优先级(粘性事件没有优先级)
在EventBus中,观察者也就是Subscription的优先级默认都为0,级别越高,越早收到消息,并且收到消息之后还能阻断后面观察者接收消息,颇有点像有序广播。
注意一下:优先级只是在相同的ThreadMode中才有效,不同的ThreadMode不起作用
@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则会动态控制并发,可能会有多个子线程
(如果任务是耗时任务会影响第二个任务执行得话,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)  

//强制后台执行 s(每次都是开启新的线程)
@Subscribe(threadMode = ThreadMode.Aync)  

//默认情况,和发送事件在同一个线程  
@Subscribe(threadMode = ThreadMode.PostThread)  

优缺点:
EventBus是greenrobot公司出的另一款开源框架,这个框架是针对Android优化的发布/订阅事件总线,使用EventBus可以极大的减少我们程序的耦合度。
调度灵活。不依赖于 Context,使用时无需像广播一样关注 Context 的注入与传递。
使用简单。
快速且轻量。
完全解耦了请求链之间的关系,避免了请求者被长持有,
比广播更轻量
可以定义在调用线程、主线程、后台线程、异步。
缺点
各种Event的定义工作量大。每次传的内容不一样,就需要重新定义一个JavaBean
3.0之前限定了方法名(3.0已经可以自定义方法名)

自拟面试题:
说说你对EventBus的了解:
以往咱们在Fragment或Activity之间传值的时候,有时候可能用一些静态方法,比较占用内存,容易造成oom,EventBus,它把注册,发送,接收的方法都封装的很简洁,相对于以往的广播,观察者,接口回调等,使用起来更加方便;传送的内容,是根据自定义的JavaBean来生成,需要传什么内容,就在Javabean创建什么属性,使用起来更加方便,随意,实用性很高,而且耦合度很低,不会浪费内存!

说说你对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
//github链接
https://github.com/greenrobot/EventBus
常见Bug:
粘性事件使用的时候:先寻找控件,然后再注册EventBus接受消息,否则会造成控件空指针有异常.

//Logger依赖库:
//compile ‘com.orhanobut:logger:1.15’

你可能感兴趣的:(咨询)