EventBus控件交互传值

EventBus控件交互传值


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 (sticky = 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)

 优缺点:

  1. EventBus是greenrobot公司出的另一款开源框架,这个框架是针对Android优
    化的发布/订阅事件总线,使用EventBus可以极大的减少我们程序的耦合度。
  2. 调度灵活。不依赖于 Context,使用时无需像广播一样关注 Context 的注入与传递。
  3. 使用简单。
  4. 快速且轻量。
  5. 完全解耦了请求链之间的关系,避免了请求者被长持有,
  6. 比广播更轻量
  7. 可以定义在调用线程、主线程、后台线程、异步。

 缺点:

  1. 各种Event的定义工作量大。每次传的内容不一样,就需要重新定义一个JavaBean
  2. 3.0之前限定了方法名(3.0已经可以自定义方法名)

 自拟面试题:

1. 说说你对EventBus的了解:

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

2. 说说你对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'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值