Android开发之EventBus的使用

2019-07-29  本文已影响0人  wind_sky

一.简介

EventBus 是一个事件总线框架,可用于应用程序内各组件、组件与后台线程间的通信,比如两个Activity 或Fragment 之间的通信,都可以用EventBus 完成,另外Android 提供的LocalBroadcastManger 也可以实现,但是相对而言使用要更复杂,同时性能表现上也比EventBus略差。

EventBus 的优点也比较明显,API非常的简洁,使用简单,框架体积小,性能好,同时降低了组件之间的耦合度

EventBus 中三种角色:

  1. Event:可以是我们自己定义的任意类型的对象

  2. Publisher:事件发布者,可以在任意位置发送事件,使用EventBus的post方法发送,根据post方法的参数类型,会自动调用订阅相应类型的事件处理方法。

  3. Subscriber:事件订阅者,订阅者内部需要声明事件处理方法,方法需要添加@Subscribe注解,注解中可以标注方法的运行的线程模型,下面介绍。

二.使用

EventBus的基本使用有下面一些步骤。

1.自定义事件

public class BEvent { 
    private String message;
    public String getMessage() {        
        return message;    
    }   
    public void setMessage(String message) {        
        this.message = message;   
    }
}

2.准备订阅者

// 注意事件处理方法要写成public

@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(BEvent event) {    
    //do something
}

同时在组件中需要注册订阅者:

以Activity为例

@Override
public void onStart() {
   super.onStart();

   EventBus.getDefault().register(this);
}

@Override
public void onStop() {
   EventBus.getDefault().unregister(this);

   super.onStop();
}

也可以在onCreate,onDestroy中注册,解除。

这里介绍一下四种线程模型:

3.发送事件

BEvent event = new BEvent();
event.setMessage("test");
EventBus.getDefault().post(event);

4.粘性事件

除了普通事件外,EventBus还支持发送粘性事件,也就是发送事件之后,再订阅事件,订阅者也能收到该事件,与粘性广播类似。粘性事件在内存中保存最新消息,新消息到来会取消原有消息,只有在注册之后才会执行新消息,不注册的话,消息会一直在内存中。

发送粘性事件:

EventBus.getDefault().postSticky(event);

订阅者处理事件:

@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
publicvoidonEvent(BEvent event) {
   // do something
}

不要忘记 注册

三. 其他

1.EventBusBuilder

EventBus提供了许多配置,一般情况下不需要配置,但有的时候可能有一些特殊要求,比如在开发的时候发生错误崩溃,而在发布的时候错误不崩溃等。

如果要修改默认实现的配置,必须在第一次EventBus.getDefault()之前配置,而且只能设置一次。所以建议在application的onCreate()中调用

EventBuseventBus = EventBus.builder().build();  //产生EventBus实例的另一种方式。

EventBus.builder()
        .throwSubscriberException(BuildConfig.DEBUG)
        .installDefaultEventBus();

2.priority事件的优先级

值越大,优先级越高。

@Subscribe(priority = 233)
public void onEvent(BEvent event) {
   //do something
}

3.终止事件的传递

终止事件传递,后续事件不再调用,注意,只能在传递事件的时候调用

@Subscribe 
public void onEvent(BEvent event) {    
    …    

    EventBus.getDefault().cancelEventDelivery(event);
}
上一篇 下一篇

猜你喜欢

热点阅读