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

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

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

下面分步骤为大家简单介绍下使用过程。

一、Bus实例化

Bus这个类是整个框架的灵魂,它负责消息的发布和接收,整个流程都是经过这个Bus去实现的。Bus的实例化推荐使用单例,就是说整个应用内只实例化一个Bus对象,所有的消息的处理都是经过这单一的实例去实现。因为要实现消息的接受者接收到发布的消息,一定要经过同一个Bus对象的处理。Bus的构造器可以接收ThreadEnforcer类型的参数,ThreadEnforcer其实是一个接口,它自身有两个实现,分别表示Bus运行在Main Thread中还是异步线程中。

二、注册和解绑Bus

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

、消息的发布

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

四、消息的订阅

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

1、方法前使用@Subscribe注解

2、访问修饰符为public

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

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

五、消息的produce

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

1、方法前使用@produce注解

2、访问修饰符为public

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

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

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

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

如果觉得对你有所帮助,欢迎大家订阅我的微信公众账号——Android干货分享(ID:android_share)。下面是微信的二维码,为你提供及时高质的Android干货。

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

事件总线框架---Otto的更多相关文章

  1. Android学习系列(43)--使用事件总线框架EventBus和Otto

    事件总线框架 针对事件提供统一订阅,发布以达到组件间通信的解决方案. 原理 观察者模式. EventBus和Otto 先看EventBus的官方定义: Android optimized event ...

  2. Otto事件总线框架的使用

    Otto是一个在Android中的事件总线框架,它是square的一个开源框架,具体介绍点击这里,项目下载点击这里 为什么要使用Otto事件总线: 通常来说在Android中: 1.Activity与 ...

  3. 事件总线帧---Otto

    我们如果这样一种业务场景.如今在做一款及时聊天应用,我们在聊天页面进行收发信息.同一时候也要实时更新前一页面的聊天记录,这时我们该怎样去实现?说说我曾经的实现策略.我使用的是广播接收器BroadCas ...

  4. EventBus事件总线框架(发布者/订阅者模式,观察者模式)

    一. android应用内消息传递的方式: 1. handler方式-----------------不同线程间传递消息. 2. Interface接口回调方式-------任意两个对象. 3. In ...

  5. Android--Otto事件总线 -- 组件之间通讯框架使用 --模式解析

    前言:Otto事件总线 -- 组件之间通讯框架 对于之前的情况activity之间或者fragment之间等跳转传值一般都是用bundle.intent等,从activityA --- activit ...

  6. AndroidEventBus ( 事件总线 ) 的设计与实现

    1. 功能介绍 AndroidEventBus是一个Android平台的事件总线库, 它简化了Activity.Fragment.Service等组件或者对象之间的交互,非常大程度上减少了它们之间的耦 ...

  7. Android事件总线EventBus详解

    顾名思义,AndroidEventBus是一个Android平台的事件总线框架,它简化了Activity.Fragment.Service等组件之间的交互,很大程度上降低了它们之间的耦合,使我们的代码 ...

  8. Android事件总线还能怎么玩?

    作者简介:何红辉,Android工程师,现任职于友盟. 顾名思义,AndroidEventBus是一个Android平台的事件总线框架,它简化了Activity.Fragment.Service等组件 ...

  9. 美团组件化事件总线方案改进:ModularEventBus

    请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 GitHub · AndroidFamily 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭锐] ...

随机推荐

  1. 计蒜客NOIP2018模拟1

    https://www.jisuanke.com/contest/1152 T1:最失败的一道题,其实就是道水题,好几种写法,一种都没想出来. 题意转化后就是:每个数可以选a[i]和a[i]-k,最后 ...

  2. JZYZOJ 1375 双亲数 莫比乌斯反演

    http://172.20.6.3/Problem_Show.asp?id=1375 网上搜推理图. 有一段没有写莫比乌斯反演都快忘了..数学能力--,定理完全不会推,但是这道题整体来说应该是比较好写 ...

  3. CodeForces - 992D Nastya and a Game

    题面在这里! 显然一段区间的 mul - sum * k = 0 才合法,然鹅我们发现sum * k 对于本题的数据来说最大才是1e18,也就是说mul必须得<=1e18. 我们不妨从这里入手, ...

  4. bzoj 1585: [Usaco2009 Mar]Earthquake Damage 2 地震伤害

    1585: [Usaco2009 Mar]Earthquake Damage 2 地震伤害 Description Farmer John的农场里有P个牧场,有C条无向道路连接着他们,第i条道路连接着 ...

  5. Django contenttypes 框架详解

    一.什么是Django ContentTypes? Django ContentTypes是由Django框架提供的一个核心功能,它对当前项目中所有基于Django驱动的model提供了更高层次的抽象 ...

  6. lightoj 1244 - Tiles 状态DP

    思路:状态DP dp[i]=2*dp[i-1]+dp[i-3] 代码如下: 求出循环节部分 1 #include<stdio.h> 2 #define m 10007 3 int p[m] ...

  7. idea创建多个Module

    练习不同的算法时,如果不断的创建工程未免过于麻烦,可以使用在一个工程下创建多个Module的方式,编写多种不同的算法,这些模块互相独立,都有一个入口函数(main),并且,对于创建好的Module,如 ...

  8. ubuntu系统使用dnw下载程序

    转:http://blog.chinaunix.net/uid-22030783-id-3350840.html 获得dnw4linux.tar.bz2 源码包,可在xcembed论坛下载:http: ...

  9. Oracle数据库查看用户状态

    一.当前ORACLE用户的状态可查看视图DBA_USERS;一般情况下在使用的正常用户均处于OPEN状态. 1 SQL> select username,account_status from  ...

  10. laravel的 array 函数

    代码如下:  routes.php文件 // 获⃣取⃣数⃣组⃣的⃣第⃣一⃣个⃣ Route::get('/helper', function () { $arr = [1, 2, 4]; return ...