事件总线框架---Otto

咱们假设这样一种业务场景,如今在作一款及时聊天应用,咱们在聊天页面进行收发信息,同时也要实时更新前一页面的聊天记录,这时咱们该如何去实现?说说我之前的实现策略,我使用的是广播接收器BroadCastReceiver,在接收和发送消息的时候就不停去发送广播,而后在须要实时更新的地方进行接收更新。实现的思想比较简单,也不存在代码上的耦合问题,可是有个弊端。弊端就是须要去在不少地方实现BroadCastRecevier,代码虽不算冗余,但比较多,看起来非常不爽。android

今天为你们介绍的Otto,就能完全解决代码体积的问题。Otto是一款目前比较流行事件总线框架,旨在保持应用各页面和模块之间通讯高效的前提下,对应用进行解耦。Otto的使用很简单,源码也只就9个类,几千行代码,开放出来的api也间接明了。Otto是基于订阅/发布(Subscribe/Publish)这样一种设计模式,简单来讲,若是你想订阅某个消息,使用@Subcribe注解便可进行接收,同时使用git

Bus.post(Object obj)进行消息的发布,这样的设计达到了彻底的解耦。github

下面分步骤为你们简单介绍下使用过程。设计模式

1、Bus实例化api

Bus这个类是整个框架的灵魂,它负责消息的发布和接收,整个流程都是通过这个Bus去实现的。Bus的实例化推荐使用单例,就是说整个应用内只实例化一个Bus对象,全部的消息的处理都是通过这单一的实例去实现。由于要实现消息的接受者接收到发布的消息,必定要通过同一个Bus对象的处理。Bus的构造器能够接收ThreadEnforcer类型的参数,ThreadEnforcer实际上是一个接口,它自身有两个实现,分别表示Bus运行在Main Thread中仍是异步线程中。微信

2、注册和解绑Bus框架

根据具体的业务需求进行Bus的注册和解绑,对于android中的组件,通常是基于生命周期方法中去实现;同时若是是任意你自定义的类中均可以进行。下面展现的是在Activity和Fragment里面实现。异步

、消息的发布post

发布消息是整个框架中最重要的部分,它容许你告诉全部的订阅者一个事件已经触发。任何一个类的实例对象均可以经过总线Bus去发布,同时也只能被订阅这种对象的接受者所接收。下面展现的是经过Bus去发布一个消息,消息的内容是LocationChangeEvent,因此LocationChangeEvent的接受者都能接收到此发布的消息。注意的是,发布消息只能一个Object对象。性能

4、消息的订阅

消息的订阅和发布以前都要在当前的类中进行Bus的注册。订阅是对消息发布的补充,当消息发布的事件调用以后,对应的消息订阅者就能当即接收到此消息。实现订阅功能是经过自定义方法实现的,方法的名称能够随意,同时还得须要知足三个条件。

一、方法前使用@Subscribe注解

二、访问修饰符为public

三、单一参数,根据你想订阅的消息进行设置

注:使用以前,记得进行注册;使用完毕,记得释放。

5、消息的produce

当订阅者注册完毕,针对特定的消息,一般也须要获取当前已知的值。这个时候,就须要用到produce。一样的使用produce的方法名称能够随意,同时有三点须要注意。

一、方法前使用@produce注解

二、访问修饰符为public

三、无参,返回值是基于订阅者参数类型

好了,Otto的使用就是这些了。快去重构代码,摆脱无尽的广播吧!

固然Otto的缺点也是有的,要实现上述订阅/发布模型的功能,付出的代价就是对各个注册Bus的类进行反射。若是大量的使用的状况下,对应用的性能多少有点副影响。

 

Otto源码和Demo地址:https://github.com/square/otto

 

若是以为对你有所帮助,欢迎你们订阅个人微信公众帐号——Android干货分享(ID:android_share)。下面是微信的二维码,为你提供及时高质的Android干货。

技术交流QQ群:318588906,欢迎你们加群,共同探讨下Android和Java技术,一块儿壮大咱们的微信干货分享社区。

相关文章
相关标签/搜索