Otto小巧的事件总线

QuibblerQuibbler 2023-08-27 约 3 分钟 1551 次阅读

Otto小巧的事件总线

Otto,不是KSG的中单,是Square在2015年发布的事件总线通信库,作者是大名鼎鼎的JakeWharton。代码行数550行(注释420行)只有EventBus的1/3,经过多年的打磨已于2019年封存不再维护。它仍然值得开发者学习。

Otto是一个事件总线,用于应用程序的不同组件之间进行有效的通信,用来降低程序之间的耦合性。Bus构造没有使用建造者模式,直接使用Bus构造函数初始化实例:

//使用默认的DEFAULT_IDENTIFIER名称
    Bus bus = new Bus();

或指定bus的名称:

//指定bus的名称
    Bus bus = new Bus("Quibbler");

以便调试打印区别不同的Bus总线对象(正常情况全局一个单例即可):

@Override public String toString() {
        return "[Bus \"" + identifier + "\"]";
    }

与EventBus不同的是,Otto中默认Bus中的事件回调是在主线程ThreadEnforcer.MAIN,也可以指定为任意线程ThreadEnforcer.ANY,或者实现ThreadEnforcer接口自定义,在构造的时候指定。而EventBus可以对每个注册的事件方法单独指定运行策略,详见EventBus源码分析(二):事件分发及处理。

Bus bus = new Bus(ThreadEnforcer.ANY);

Otto同样使用观察者设计模式,主要对象:发布者、订阅者、事件。先定义一个事件:

public static class Event {
        //something
    }

在订阅者内定义方法,并使用@Subscribe注解该方法,方法参数指定需要监听的事件:

@Subscribe
    public void onEvent(Event event) {
        //todo
    }

使用register()方法注册事件订阅者:

bus.register(suscriber);

在应用同进程内通过post()方法将事件发布消息给订阅者,实现解耦:

bus.post(new Event());

一定别忘记unregister()反注册订阅者,Android中内存泄漏一部分原因是因为注册后没有反注册引起:

bus.unregister(suscriber);

Otto就是这么简单直接,仅定义暴露三个公有方法:register()、post()、unregister(),没有其它多余眼花缭乱的方法。

一个优秀的开源库应当尽可能暴露少的接口,将大部分操作封装起来,使用起来力求简洁高效。接下来学习Otto内部的实现,如何用550行代码实现事件总线。

相关推荐

精选
Airbnb开源项目
开源

Airbnb开源项目

Airbnb Engineering & Data ScienceAirflow Use Apache Airflow (incubating) to author workflows as directed acyclic graphs (DAGs) of tasks12,263Airpal Web UI for PrestoDB2,502Aerosolve A machine learning

1.8k
OkHttp线程池和连接池
开源

OkHttp线程池和连接池

OkHttp线程池和连接池了解了OkHttp的网络请求流程以及拦截器实现原理,再关注OkHttp中两个重要的:OkHttp的线程池和连接池。1、OkHttp线程池在OkHttp网络请求流程一文中,我们分析了OkHttp异步和同步请求流程。请求最后都在Dispatcher中分发调度处理,最后被ExecutorService执行。1.1、DispatcherDispatcher中执行任务的执行器是ex

5.2k
优美的开源动效库:Lottie
开源

优美的开源动效库:Lottie

优美的开源动效库:Lottie1、强大的动效LottieLottie是一个适用于Android,iOS,Web和Windows的库,它可以使用Bodymovin解析以json格式导出的Adobe After Effects动画,并在移动设备和Web上原生渲染它们!GitHub:https://github.com/airbnb/lottie-androidLottie官网:http://airbn

4.3k