zoukankan      html  css  js  c++  java
  • [EventBus源码解析] 初探EventBus

      本期blog作为EventBus(以下简称EB)学习的始动篇,主要记载了EB的功能、优点、使用方法,内容基于github上的README.mdHOWTO.md

    何为EventBus

      EB实现了Android上的一种事件分发/接收总线机制,其优点可以概括为以下三条:

    1. 简洁:将事件分发者与接收者解耦,代码简单清晰;
    2. 快速:使用了反射,而不是在Android上效率低下的注解方式进行实现
    3. 轻量级:jar <50k

    EventBus的使用方法

      将EventBus引入到项目中(gradle)  

    compile 'de.greenrobot:eventbus:2.4.0'

      分发事件

    eventBus.post(anyEvent);

      接收事件

    eventBus.register(this);
    public void onEvent(AnyEvent e) {/* do something */};

      以上就是非常简单的EventBus使用方法,下面是部分进阶内容:)

    EB中不同的线程模式/ThreadMode

      在实际开发中,往往需要根据需求的不同(是UI变化还是网络请求等),在不同的线程中进行逻辑处理。EB通过在接收者中使用不同的方法命名,为我们提供了简便的处理方法,无须深入到复杂的线程内部。

    • PostThread: 默认的调用方式,在同一线程中启动。如无特别需求,皆应采取此方式。
    • MainThread: 在主线程(UI线程)中启动,应避免长时间操作阻塞主线程(ANR)。
    • BackgroundThread: EB使用固有的后台线程进行处理,也应当避免长时间操作造成阻塞。
    • Async: 异步处理,在主线程与后台线程之外启动新的线程,长时间操作应当用此模式。EB内建了线程池用于复用。

      在接收者中以方法名onEventXXX来使用不同的线程模式。

    定制Custom EB

      通常简便的获取EventBus实例是通过 EventBus.getDefault() 来获取单例,当需要对其进行定制时,可以通过EventBusBuilder进行。

    EventBus eventBus = EventBus.builder().logNoSubscriberMessages(false).sendNoSubscriberEvent(false).build(); // 当没有对应接收者时,不发送消息

      更多的用法可以参阅javadoc

    定制Default EB

      如果想对默认的EB单例进行定制,需要在初次调用EventBus.getDefault()之前进行,通常建议放在Application类中。

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

    终止Event分发

      在onEvent中通过eventBus.cancelEventDelivery(event)可以终止该Event的继续分发

    接收者优先级

      具有更大优先级的接收者,会优先处理信息,可以搭配上一条(终止Event分发)使用。

    int priority = 1;
    EventBus.getDefault().register(this, priority);

    Sticky Events

      不知道怎样恰当翻译(粘性事件?)。EB内建了一个微型的缓存机制,可以保存最近一次以Sticky形式发送的Event,当接收者(须生命为Sticky)注册的时间晚于最近一个StickyEvent时,仍然可以接收到该Event。

      发送StickyEvent

    EventBus.getDefault().postSticky(someEvent);

      接收StickyEvent

    @Override
    public void onStart() {
        super.onStart();
        EventBus.getDefault().registerSticky(this);
    }
    
    public void onEvent(SomeEvent e) {
        /* do something */
    }
    
    @Override
    public void onStop() {
        EventBus.getDefault().unregister(this);
        super.onStop();
    }

      获取上一个StickyEvent

    EventBus.getDefault().getStickyEvent(Class<?> eomeEventType);

    ProGuard配置

      因为ProGuard会对方法名进行混淆,而EB是基于反射完成的,故需要在ProGuard文件(proguard.cfg)中配置特殊规则

    -keepclassmembers class ** {
        public void onEvent*(**);
    }
    
    # Only required if you use AsyncExecutor
    -keepclassmembers class * extends de.greenrobot.event.util.ThrowableFailureEvent {
        <init>(java.lang.Throwable);
    }

    AsyncExcutor

      非核心功能,暂且略过不表。

  • 相关阅读:
    从编程到入侵
    编程实现盗2005 Beta2版QQ
    Justin Frankel:Winamp的反斗奇星
    用安静的热情征服联合国
    我和试用期员工之间的故事
    Sogou输入法之父给我们的启示
    《ATL开发指南》的一个值得商榷的地方
    厦门PX项目迁址:意义有限的进步
    探析项目主导型的IT业的人员需求变化及其应对办法
    今天,影响了一位试用期员工的去留
  • 原文地址:https://www.cnblogs.com/maozhige/p/4720411.html
Copyright © 2011-2022 走看看