美文网首页
Android开发之EventBus的使用

Android开发之EventBus的使用

作者: wind_sky | 来源:发表于2019-07-29 11:14 被阅读0次

一.简介

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中注册,解除。

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

  • ThreadMode.POSTING:默认调用方式,在调用post方法的线程中执行,避免了线程切换,性能开销最小,注意不要执行耗时操作,可能会阻塞时间传递甚至会导致ANR。

  • ThreadMode.MAIN:在主线程中执行,同样注意不要执行耗时操作。

  • ThreadMode.BACKGROUND:如果调用post方法的线程不是主线程,则直接在该线程中执行,如果是在主线程则切换到后台单例线程,多个方法公用同个后台线程,按顺序执行,所以也要避免过于耗时的操作。

  • ThreadMode.ASYNC:开辟新的独立线程,可用来处理耗时操作,EventBus内部使用线程池,但要尽量避免大量长时间的异步线程,默认使用Executor.newCachedThreadPool(),可通过EventBusBuilder修改。

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

相关文章

网友评论

      本文标题:Android开发之EventBus的使用

      本文链接:https://www.haomeiwen.com/subject/vfgvrctx.html