EventBus中观察者模式的应用
一 介绍
EventBus是一款安卓的开源消息传递框架,地址:https://github.com/greenrobot/EventBus
android系统的消息传递非常复杂,比如activity和activity之间,同一个activity内部其他线程和主线程之间,activity和service之间,activity和broadcastreceiver之间,可用的处理方式有Bundle对象,Handler方式,AnsycTask方式。
EventBus的目的是统一这些消息处理过程,将消息处理过程抽象为发布者-订阅者模式,发送消息的组件叫做发布者publisher,接受消息的组件叫做订阅者subscriber,消息传递的过程就是发布者发布一个事件,然后订阅者接受。
这实际上是用的就是观察者模式,订阅者就是观察者,随时准备对发布者发布的信息做出反应。
上面是EventBus的工作流程,Publisher是发布者,EventBus是一个消息的集合或者说中间件,Subscriber是订阅者,它在一个类里面,是该类的一个子线程,它负责时刻监听发布者Publisher发送的消息,然后对消息做出反应。这是典型的观察者模式。
二 代码分析
订阅者是一个实体类,代码在https://github.com/greenrobot/EventBus/blob/master/EventBus/src/org/greenrobot/eventbus/Subscribe.java
订阅方法的代码在https://github.com/greenrobot/EventBus/blob/master/EventBus/src/org/greenrobot/eventbus/SubscriberMethod.java,如下所示:
这里定义了发布者发布消息的一些属性,比如消息的优先级priority,是否是粘滞消息sticky(可以先发布消息,稍后注册),线程的模型threaedMode。
再来看发布者,发布者分为好几种:
分类的依据是它们发布消息的线程模式。
来看一下其中HandlerPoster的源代码:
可以看到,它继承了Handler类,所以明显这个发布者发布消息的过程其实就是调用了安卓系统本来有的handler模式,或者说封装了Handler模式。
继续看它的代码:
这里的handlerMessage方法就是用来监听发送给自己的消息,然后进行处理,这是典型的观察者模式的应用。
再来看一下AsyncPoster,这也是一个发布者类,其中有一个方法run:
在这个方法里面,发布者通过invokeSubscriber通知订阅者,这是观察者模式中的消息通知方式。
以上就是EventBus中使用观察者模式的全部例子。
EventBus中观察者模式的应用的更多相关文章
- java中观察者模式Observable和Observer
25.java中观察者模式Observable和Observer 如果想要实现观察者模式,则必须依靠java.util包中提供的Observable类和Observer接口 观察者设计模式 现在很多的 ...
- Android中观察者模式的升入理解
以前对Java中的观察者模式只知道一点皮毛,在接触Android的过程中,逐渐认识到观察者模式是如此的重要,android中许多地方都用到了观察者模式例如ContentResolver操作,来总结一下 ...
- 25、java中观察者模式Observable和Observer
如果想要实现观察者模式,则必须依靠java.util包中提供的Observable类和Observer接口 观察者设计模式 现在很多的购房者都在关注着房子的价格变化,每当房子价格变化的时候,所有的购房 ...
- 浅谈Adapter中观察者模式
首先让我们看一个客户端图片 这是京东客户端的购物车界面.有这么一种功能,当我们在商品列表中调整商品数量等信息的时候,下方的金额总数也随之变化. 可以看出,这个界面有一个数据源,一个适配器,一个List ...
- Vue中观察者模式的实现
Vue中实现观察者模式的方法可以有三种: 1.v-on方法 exp: <div id='test'> <button v-on:event='functionName'>but ...
- Vert.x中EventBus中的使用
注意:使用的是vert.x3.0 仅支持到java8当中有一些lambda表达式.如不明确请自补java8新特性. The Event Bus event bus 是vert.x的神经系统. 每个ve ...
- 【一起学设计模式】观察者模式实战:真实项目中屡试不爽的瓜娃EventBus到底如何实现观察者模式的?
申明 本文章首发自本人公众号:壹枝花算不算浪漫,如若转载请标明来源! 感兴趣的小伙伴可关注个人公众号:壹枝花算不算浪漫 22.jpg 前言 之前出过一个设计模式的系列文章,这些文章和其他讲设计模式的文 ...
- 项目中应用eventbus解决的问题
在项目开发过程中,往往有些功能表面看起来简单,但实际开发的结果非常复杂,仔细分析下原因发现很多都是因为附加了许多的额外功能. 真的简单吗? 比如我们对一个电商平台的商品数据做修改的功能来讲,其实非常简 ...
- Android开发中常见的设计模式(三)——观察者模式
先看下这个模式的定义. 定义对象间的一种一对多的依赖关系,当一个对象的状态发送改变时,所有依赖于它的对象都能得到通知并被自动更新 先来讲几个情景. 情景1:有一种短信服务,比如天气预报服务,一旦你订阅 ...
随机推荐
- [Swift]LeetCode864. 获取所有钥匙的最短路径 | Shortest Path to Get All Keys
We are given a 2-dimensional grid. "." is an empty cell, "#" is a wall, "@& ...
- [Swift]LeetCode985. 查询后的偶数和 | Sum of Even Numbers After Queries
We have an array A of integers, and an array queries of queries. For the i-th query val = queries[i] ...
- [C#]批量修改文件后缀名
代码: /// <summary> /// 修改文件后缀 /// </summary> /// <param name="extension"> ...
- MySQL下载、安装和登录详解
MySQL是一个小型的数据库管理系统,由于其体积小,速度快,尤其是开放源代码等优点,使得其在开发中得到广泛的使用,本文主要介绍MySQL数据库从下载到安装及通过命令行的使用等. 一.下载部分 下载链接 ...
- 呵呵,Python操作MSSQL的帮助类
从网上找的,估计原文是:Python操作SQLServer示例 本文主要是Python操作SQLServer示例,包括执行查询及更新操作(写入中文). 需要注意的是:读取数据的时候需要decode(' ...
- asp.net core AuthenticationMiddleware 在WebApi中的的使用
在.net framework 4.5架构下使用认证(Authentication)授权(Authorization). IIS使用HttpModule进行认证(Authentication),我们可 ...
- 使用dotnet build时复制引用dll到生成目录
默认配置下dotnet build只会输出项目代码的dll,依赖用的是dotnet缓存中的dll,只有dotnet publish才会把依赖的dll一起输出到生成目录. 在项目csproj文件中添加以 ...
- TypeError: unorderable types: str() >= int()
1.问题描述 age=input('please enter your age') if age >=18: print('your age is',age) print('adult') el ...
- 前端笔记之JavaScript(六)让人头疼的正则表达式
一.正则表达式 1.1正则概述和体验 正则表达式是被用来匹配字符串中的字符组合的模式,常用来做表单验证.在JavaScript中,正则表达式也是对象,是一种引用类型. 案例:正确输入一个电话号码,01 ...
- 浅析Javascript单例模式
定义 保证一个类仅有一个实例,并提供一个访问它的全局访问点 .就想我们在开发中有些对象只需要一个,例如window对象. 1. 实现单例模式 var Singleton = function( nam ...