美文网首页
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