一 介绍

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中观察者模式的应用的更多相关文章

  1. java中观察者模式Observable和Observer

    25.java中观察者模式Observable和Observer 如果想要实现观察者模式,则必须依靠java.util包中提供的Observable类和Observer接口 观察者设计模式 现在很多的 ...

  2. Android中观察者模式的升入理解

    以前对Java中的观察者模式只知道一点皮毛,在接触Android的过程中,逐渐认识到观察者模式是如此的重要,android中许多地方都用到了观察者模式例如ContentResolver操作,来总结一下 ...

  3. 25、java中观察者模式Observable和Observer

    如果想要实现观察者模式,则必须依靠java.util包中提供的Observable类和Observer接口 观察者设计模式 现在很多的购房者都在关注着房子的价格变化,每当房子价格变化的时候,所有的购房 ...

  4. 浅谈Adapter中观察者模式

    首先让我们看一个客户端图片 这是京东客户端的购物车界面.有这么一种功能,当我们在商品列表中调整商品数量等信息的时候,下方的金额总数也随之变化. 可以看出,这个界面有一个数据源,一个适配器,一个List ...

  5. Vue中观察者模式的实现

    Vue中实现观察者模式的方法可以有三种: 1.v-on方法 exp: <div id='test'> <button v-on:event='functionName'>but ...

  6. Vert.x中EventBus中的使用

    注意:使用的是vert.x3.0 仅支持到java8当中有一些lambda表达式.如不明确请自补java8新特性. The Event Bus event bus 是vert.x的神经系统. 每个ve ...

  7. 【一起学设计模式】观察者模式实战:真实项目中屡试不爽的瓜娃EventBus到底如何实现观察者模式的?

    申明 本文章首发自本人公众号:壹枝花算不算浪漫,如若转载请标明来源! 感兴趣的小伙伴可关注个人公众号:壹枝花算不算浪漫 22.jpg 前言 之前出过一个设计模式的系列文章,这些文章和其他讲设计模式的文 ...

  8. 项目中应用eventbus解决的问题

    在项目开发过程中,往往有些功能表面看起来简单,但实际开发的结果非常复杂,仔细分析下原因发现很多都是因为附加了许多的额外功能. 真的简单吗? 比如我们对一个电商平台的商品数据做修改的功能来讲,其实非常简 ...

  9. Android开发中常见的设计模式(三)——观察者模式

    先看下这个模式的定义. 定义对象间的一种一对多的依赖关系,当一个对象的状态发送改变时,所有依赖于它的对象都能得到通知并被自动更新 先来讲几个情景. 情景1:有一种短信服务,比如天气预报服务,一旦你订阅 ...

随机推荐

  1. PHP算法之冒泡排序

    //冒泡排序 //①思路,先比较出第一次,找一个最大的值,排到最后; //②重复count遍之后,就能得到排序; //③优化,每一次循环之后不需要再次全部重复; $array = [11,5,4,58 ...

  2. ubuntu16.04安装lnmp环境

     1.安装mysql sudo apt install mysql-server 2.安装nginx和php #添加nginx和php的ppa源 sudo apt-add-repository ppa ...

  3. 老司机教你用原生JDK 撸一个 MVC 框架!!!

    其实 Spring MVC 是一个基于请求驱动的 Web 框架,并且也使用了前端控制器模式来进行设计,再根据请求映射规则分发给相应的页面控制器进行处理,具体工作原理见下图. 在这里,就不详细谈相关的原 ...

  4. scala的input

    获取用户输入的信息,一般使用 input 函数,但是 scala 里面是没有 input 这个方法的,为了获取控制台的输入操作, scala 定义的方法为: val Inputcontent = Co ...

  5. SpringCloud(7)---网关概念、Zuul项目搭建

    SpringCloud(7)---网关概念.Zuul项目搭建 一.网关概念 1.什么是路由网关 网关是系统的唯一对外的入口,介于客户端和服务器端之间的中间层,处理非业务功能 提供路由请求.鉴权.监控. ...

  6. 『Balancing Act 树的重心』

    树的重心 我们先来认识一下树的重心. 树的重心也叫树的质心.找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡. 根据树的重心的定义,我们可 ...

  7. C# - 2017微软校园招聘笔试题 之 MS Recognition[待解决]

    MS Recognition 在线提交: hihoCoder 1402 http://hihocoder.com/problemset/problem/1402 类似: OpenJudge - I:P ...

  8. AngularJS2+调用原有的js脚本(AngularJS脚本跟本地原有脚本之间的关系)

    昨天一个话题说关于AngularJS2以后版本的两个小技巧,不料引出了另外一个话题,话题起始很简单: "很多的前端框架并不复杂,比如JQuery,引入即用,实时看到效果,多好.到了Angul ...

  9. 【WCF系列】(一)为什么我们需要WCF

    为什么我们需要WCF 传统分布式软件的架构分析 一个开发需求:社保平台 访问量较大客户端类型/平台多和其他系统交互多快速开发/部署结构复杂(B/S.C/S.桌面.服务…) 传统的实现技术: 业界需要一 ...

  10. leetcode — convert-sorted-list-to-binary-search-tree

    import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Source : https://o ...