这里特使用了github中的一个项目作为例子进行解析,地址为:https://github.com/LiqiNew/HandlerFrame/tree/master/handlerFrame/src/main/java/com/liqi/handler

本例子针对安卓程序实现了跨界面的Handler通讯。传统来说,安卓程序中的Handler是只能在一个界面类中运行的,并不能让他存在于其他的界面类,但在这个项目中,"只要在HandlerFrame里面订阅过的对象,在任何界面都可以发送信息去跟订阅对象通讯"。其使用了观察者模式来设计一个新的框架,类图如下所示:

按照观察者模式的定义,上图中的BaseHandler为观察者,而BaseHandlerOperate为被观察者。其中BaseHandlerOperate作为被观察者,其工作是将BaseHandler收入订阅者队列并对观察者进行管理,包括删除和信息通知。在BaseHandlerOperate中,onSubscribe负责将观察者绑定在订阅者队列中,而sendMessage负责向观察者传递消息,removeFactoryKeyData则负责按照键值取消订阅,也可以用removeAllFactoryData将所有的订阅都删除。另外,在这个例子里也使用了工厂模式。BaseHandler在订阅之前需要经过BaseHandlerFactoryId进行预处理,生成符合规范的键值对后才可加入订阅。

在这样的设计之下,Handler与收发信息的控件之间不仅形成了松耦合的关系,还实现了跨界面的通信,大大便利了安卓程序内信息的流通,同时避免了生成过多Handler所造成的内存负担。

解析观察者模式在安卓程序中的应用——如何实现跨界面Handler通讯的更多相关文章

  1. 安卓程序中手机后退键与标题栏后退键是不同的,前者回出发onBackPressed()函数,后者需要重重写temclick函数

    安卓程序中手机后退键与标题栏后退键是不同的,前者回出发onBackPressed()函数,后者需要重重写temclick函数

  2. Unity3D安卓程序中提示窗与常用静态方法封装

    Unity3D/安卓封装SDK常用方法 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 IO -- - ...

  3. Delphi XE7的安卓程序如何调用JAVA的JAR,使用JAVA的类?

    本文使用工具和全部源码下载: http://download.csdn.net/detail/sunylat/8190765 为什么我们要在Delphi XE7的安卓程序调用JAVA的JAR,使用JA ...

  4. 微信小程序中时间转化为时间戳(安卓和苹果兼容性)

    在IOS中时间显示NAN,后来才知道是由于安卓和IOS时间解析时间的时间格式不一致: 在安卓机中2018-06-21 16:00:21 IOS识别的格式是 2018/06/21: 所以在处理IOS机器 ...

  5. Delphi XE7中开发安卓程序一些有用的帮助资源

    说明:要想看到下面资源,打开帮助后,在搜索里面输入URL最后一部分,如果最后带“.html”,则把它删除,随后搜索一下,就看到了. 例如:想看下面的FireMonkey类关系图,只在搜索里面输入&qu ...

  6. MFC Wizard创建的空应用程序中各个文件内容的解析

    创建的MFC应用程序名为:wd,那么: 一.wd.h解析 // wd.h : main header file for the WD application // #if !defined(AFX_W ...

  7. 捕捉WPF应用程序中XAML代码解析异常

    原文:捕捉WPF应用程序中XAML代码解析异常 由于WPF应用程序中XAML代码在很多时候是运行时加载处理的.比如DynamicResource,但是在编译或者运行的过程中,编写的XAML代码很可能有 ...

  8. 安卓WebView的使用,在应用程序中嵌入一个浏览器,轻松地展示各种各样的网页

    WebView 在应用程序中嵌入一个浏览器,轻松地展示各种各样的网页. 1.定义一个WebView位置 <?xml version="1.0" encoding=" ...

  9. 安卓程序代写 网上程序代写[原]Android之Bluetooth编程

    ViewGroup 相关资料 : http://www.incoding.org/admin/archives/199.html http://bbs.csdn.net/topics/37014474 ...

随机推荐

  1. jQuery对象与DOM对象互相转换

    1.jQuey对象转DOM对象 a. [index]   代码如下: var $a = $("#a"); //jQuery对象 var a = $a[]; //DOM对象 b. g ...

  2. mybatis(二)

    一级缓存和二级缓存 mybatis一二级缓存测试实例: package com.atguigu.mybatis.test; import java.io.IOException; import jav ...

  3. hosts 添加主机和ip映射

    背景:在服务器搭建环境时,迁移项目后,停止服务出现以下问题. 原因:项目停止或启动找不到映射名称或服务. 解决:修改hosts文件.hosts文件地址 /etc/hosts         添加主机和 ...

  4. HTML网页音频控制

    // 音频播放function playSound(url) { var borswer = window.navigator.userAgent.toLowerCase(); var audio; ...

  5. DevExpress ASP.NET Core Controls 2019发展蓝图(No.2)

    本文主要为大家介绍DevExpress ASP.NET Core Controls 2019年的官方发展蓝图,更多精彩内容欢迎持续收藏关注哦~ [DevExpress ASP.NET Controls ...

  6. node.js安装使用express框架

    官网:http://www.expressjs.com.cn/ 使用方式(如果后面需要添加路由等推荐第二种方式,不然需要需要手动添加):一.自己动手搭建 1. 新建项目文件夹,如test,并在命令行中 ...

  7. undo系统参数详解

    查看与undo相关的系统参数 1.undo_management 有两个参数值:auto.manual(默认) manual:系统启动后使用rollback segment存储undo信息: auto ...

  8. c语言头文件的认识

    c头文件的作用是什么,和.c文件是怎么联系的,该怎么样编写头文件呢?这些问题我一直没搞明白,在阅读uCOS-II(邵贝贝)“全局变量”部分有些疑惑,今天终于搞清楚了头文件的一些基础知识,特地分享一下. ...

  9. linux 搭建SVN服务端

    搞了个服务器,然后现在想搞点事情,于是乎整个SVN在上面,算是熟悉下svn的操作过程 以下内容转载自: https://yq.aliyun.com/articles/6693 ------------ ...

  10. wpf binging(四) 不明确的目标绑定

    并不是每个控件都被设置了 Name 属性 ,有时候 我们只知道 他与某个控件的层级关系, 示例: AncestorType:类型代表要寻找的控件的类型 Ancestprlevel:偏移量 ,比如 1 ...