浅谈EventBus

EventBus依赖库:

compile 'org.greenrobot:eventbus:3.0.0'

 

 

EventBus主要角色:

 Event 传递的事件对象

 Subscriber  事件的订阅者 

 Publisher 事件的发布者

 ThreadMode 定义函数在何种线程中执行

角色的协作图

浅谈EventBus_第1张图片

 

基本使用:

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) { }

   

BackgroundThreadAsync区别

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.     EventBusgreenrobot公司出的另一款开源框架,这个框架是针对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'

 

你可能感兴趣的:(android)