EventBus线程间通信

1. EventBus 是干嘛的

EventBus是一款针对Android优化的发布/订阅事件总线。简化了应用程序内各组件间、组件与后台线程间的通信。优点是开销小,代码更优雅,以及将发送者和接收者解耦。如果Activity和Activity进行交互还好说,如果Fragment和Fragment进行交互着实令人头疼,如果用广播来处理,稍显麻烦并且效率也不高,传递的数据是实体类需要序列化,那么成本会有点高。EventBus就是解决上述麻烦的好帮手。

2. EventBus 的三要素

  1. Event:事件,可以使任意类型的对象。
  2. Subscriber:事件订阅者,接收消息并进行相应处理,必须有共有的事件处理函数。
  3. Publisher:事件发布者,可在任意线程发布事件,自动调用对应事件类型的处理函数。

3. EventBus 用起来很方便

3.1 添加依赖
compile 'org.greenrobot:eventbus:3.1.1' //当天版本
3.2 创建Event对象(一个普通的类,没什么说的)
public class EventDemo {
    private String data;

    public EventDemo(String data) {
        this.data = data;
    }

    public String getData() {
        return data;
    }
}
3.3 Subscriber 处理Event
3.3.1 注册EventBus
EventBus.getDefault().register(this);
3.3.2 写Event处理函数(函数名自定义)

处理函数有几点注意:

  • 必须是 public
  • 必须添加注解 @Subscribe(threadMode = ThreadMode.MAIN, sticky = false)
  • threadMode:线程模式,共4种,下文会提
  • sticky:粘性事件,下文会提

4种线程模式:

  • POSTING:Event处理函数在发布Event的线程中执行。(ANR)
  • MAIN:Event处理函数在UI线程中执行。(ANR)
  • BACKGROUND:如果发布Event的线程是UI线程,Event处理函数就新建子线程中执行;如果发布Event的线程是子线程,那么就在当前子线程执行。(不允许修改UI)
  • ASYNC:新建子线程执行Event处理函数。(不允许修改UI)

Event处理函数例子:

@Subscribe(threadMode = ThreadMode.MAIN, sticky = false)
public void dealEvent(EventDemo eventDemo) {
    //具体操作
}

注意:EventBus是根据Event处理函数的参数来区分消息的。

3.3.3 别忘了注销EventBus
EventBus.getDefault().unregister(this);
3.4 Publisher 发送Event
EventBus.getDefault().post(new EventDemo("我是发送过来的数据"));

4. 关于粘性事件

黏性事件,就是在发送事件之后再订阅该事件也能收到该事件,跟黏性广播类似。

  • Event处理函数的标签中声明接收粘性事件 sticky = true
  • 发送Event时调用
EventBus.getDefault().postSticky(new EventDemo("我是粘性数据"));

5. 最后附上demo地址

https://github.com/DasinWong/EventBusDemo

你可能感兴趣的:(Android开发,EventBus3,事件处理,线程间通信)