Android之EventBus3.0使用

在安卓开发进行组件、页面间通信的时候,传值也会遇到麻烦的时候,遇到复杂困难的情况就使用广播通知。但是,当代码繁杂时,总体便会显得有些混乱。使用EventBus可以解决这一问题。框架使用简单,采用观察者模式。在此记录EventBus的基本用法。

概述

EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。使用起来很方便,当我们的代码量变得很多的时候,使用EventBus后你的逻辑非常的清晰,并且代码之间高度解耦。

消息总线主要有三个组成部分:

  • 事件(Event)
  • 事件订阅者(Subscriber)
  • 事件发布者(Publisher)

    Android之EventBus3.0使用_第1张图片

三要素

  • Event 事件。它可以是任意类型。
  • Subscriber 事件订阅者。在EventBus3.0之前我们必须定义以onEvent开头的那几个方法,分别是onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,而在3.0之后事件处理的方法名可以随意取,不过需要加上注解@subscribe(),并且指定线程模型,默认是POSTING。
  • Publisher 事件的发布者。我们可以在任意线程里发布事件,一般情况下,使用EventBus.getDefault()就可以得到一个EventBus对象,然后再调用post(Object)方法即可。

四种线程

EventBus3.0有四种线程模型,分别是:

  • POSTING  (默认) 表示事件处理函数的线程跟发布事件的线程在同一个线程。
  • MAIN  表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。
  • BACKGROUND  表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。
  • ASYNC  表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作。

  依赖

build.gradle添加引用:

implementation 'org.greenrobot:eventbus:3.1.1'

 注册事件

@Override
protected void onCreate(Bundle savedInstanceState) {           
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
     EventBus.getDefault().register(this);
} 

解除注册 

@Override
protected void onDestroy() {
    super.onDestroy();
    //解除EventBus注册
    if(EventBus.getDefault().isRegistered(this)) {
        EventBus.getDefault().unregister(this);
    }
}

发送事件

//可以发送任何类型
EventBus.getDefault().post("zachary");

处理事件 

处理消息的方法名字可以随便取。但是需要加一个注解@Subscribe,并且要指定线程模型.

@Subscribe(threadMode = ThreadMode.MAIN)
public void XXX(String message) {
    ...
}

priority事件优先级

//priority越大,级别越高
@Subscribe(threadMode = ThreadMode.MAIN,priority = 100) 
public void onEvent(MainMessage event) {
    ...
}

终止事件传递

// 中止事件传递,后续事件不调用

@Subscribe
public void onEvent(MessageEvent event){
    EventBus.getDefault().cancelEventDelivery(event) ;
}

混淆代码:

-keepattributes *Annotation*
-keepclassmembers class ** {
    @org.greenrobot.eventbus.Subscribe ;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }

即使遇到很复杂的情况,也可以完成通信,毕竟可以传递任何类型的信息。

注意:EventBusException: Subscriber class *** and its super classes have no public methods with the@Subscribe

问题很有几种情况:

  1. 缺少@Subscribe这个注解
  2. 发送和接收的类需要统一
  3. fragment也要有注册和取消注册,
  4. 需要注意混淆开启与配置
  5. 接收消息的组件需要注册和取消注册,其他不需要。

你可能感兴趣的:(Android之开发框架)