Android观察者模式的简单实现demo
观察者模式就是:当一个对象的状态发送改变时,所有依赖于它的对象都能得到通知并被自动更新。
下面介绍一种简单的使用方法,(下面有demo链接)先看一下project的目录构成:
ObserverListener是观察者接口,SubjectListener是被观察者接口,ObserverManager是观察者的管理类。
- /**
- * Created by Administrator on 2016/9/28.
- * 观察者接口
- */
- public interface ObserverListener {
- void observerUpData(String content);//刷新操作
- }
- /**
- * Created by Administrator on 2016/9/28.
- * 被观察者接口
- */
- public interface SubjectListener {
- void add(ObserverListener observerListener);
- void notifyObserver(String content);
- void remove(ObserverListener observerListener);
- }
下面是比较重要的管理类:
- public class ObserverManager implements SubjectListener {
- private static ObserverManager observerManager;
- //观察者接口集合
- private List<ObserverListener> list = new ArrayList<>();
- /**
- * 单例
- */
- public static ObserverManager getInstance(){
- if (null == observerManager){
- synchronized (ObserverManager.class){
- if (null == observerManager){
- observerManager = new ObserverManager();
- }
- }
- }
- return observerManager;
- }
- /**
- * 加入监听队列
- */
- @Override
- public void add(ObserverListener observerListener) {
- list.add(observerListener);
- }
- /**
- * 通知观察者刷新数据
- */
- @Override
- public void notifyObserver(String content) {
- for (ObserverListener observerListener : list){
- observerListener.observerUpData(content);
- }
- }
- /**
- * 监听队列中移除
- */
- @Override
- public void remove(ObserverListener observerListener) {
- if (list.contains(observerListener)){
- list.remove(observerListener);
- }
- }
- }
效果是当点击ThirdActivity中的按钮时,执行ObserverManager.getInstance().notifyObserver("观察者请刷新信息");
然后所有添加到监听队列的Activity都会更新数据,ObserverManager.getInstance().add(this)就是添加到监听队列的方法,更新操作执行在observerUpData(String content)方法中。
下面是3个Activity,很简单:
- public class MainActivity extends AppCompatActivity implements ObserverListener {
- private TextView textView;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- textView = (TextView) findViewById(R.id.tv);
- findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- //ObserverManager.getInstance().notifyObserver("观察者请刷新信息");
- Intent intent = new Intent(MainActivity.this,SecondActivity.class);
- startActivity(intent);
- }
- });
- //注册
- ObserverManager.getInstance().add(this);
- }
- @Override
- public void observerUpData(String content) {
- Log.d("vvvvvvvvvvvvvvv","11111111111");
- textView.setText(content);
- }
- }
- public class SecondActivity extends AppCompatActivity implements ObserverListener {
- private TextView textView;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_second);
- textView = (TextView) findViewById(R.id.tv2);
- findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- Intent intent = new Intent(SecondActivity.this,ThirdActivity.class);
- startActivity(intent);
- }
- });
- //注册
- ObserverManager.getInstance().add(this);
- }
- @Override
- public void observerUpData(String content) {
- Log.d("vvvvvvvvvvvvvvv","2222222222");
- textView.setText(content);
- }
- }
- public class ThirdActivity extends AppCompatActivity implements ObserverListener {
- private TextView textView;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_third);
- textView = (TextView) findViewById(R.id.tv3);
- findViewById(R.id.btn3).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- ObserverManager.getInstance().notifyObserver("观察者请刷新信息");
- }
- });
- //注册
- ObserverManager.getInstance().add(this);
- }
- @Override
- public void observerUpData(String content) {
- Log.d("vvvvvvvvvvvvvvv","33333333333");
- textView.setText(content);
- }
- }
布局都是一个TextView和一个Button。
demo链接http://yun.baidu.com/share/link?shareid=2719259515&uk=1969594477
Android观察者模式的简单实现demo的更多相关文章
- ESA2GJK1DH1K基础篇: Android连接MQTT简单的Demo
题外话 我老爸也问我物联网发展的趋势是什么!!!!!! 我自己感觉的:(正在朝着 "我,机器人" 这部电影的服务器方向发展) 以后的设备都会和服务器交互,就是说本地不再做处理,全部 ...
- I.MX6 Android backlight modify by C demo
/************************************************************************** * I.MX6 Android backligh ...
- Android -BLE蓝牙小DEMO
代码地址如下:http://www.demodashi.com/demo/13890.html 原文地址: https://blog.csdn.net/vnanyesheshou/article/de ...
- [Android]RecyclerView的简单演示样例
去年google的IO上就展示了一个新的ListView.它就是RecyclerView. 下面是官方的说明,我英语能力有限,只是我大概这么理解:RecyclerView会比ListView更具有拓展 ...
- Android中Service的一个Demo例子
Android中Service的一个Demo例子 Service组件是Android系统重要的一部分,网上看了代码,很简单,但要想熟练使用还是需要Coding. 本文,主要贴代码,不对Servic ...
- C#可扩展编程之MEF学习笔记(一):MEF简介及简单的Demo
在文章开始之前,首先简单介绍一下什么是MEF,MEF,全称Managed Extensibility Framework(托管可扩展框架).单从名字我们不难发现:MEF是专门致力于解决扩展性问题的框架 ...
- Android HandlerThread 的使用及其Demo
今天我们一起来学习下一个Android中比较简单的类HandlerThread,虽然它的初始化有点小麻烦. 介绍 首先我们来看看为什么我们要使用HandlerThread?在我们的应用程序当中为了实现 ...
- Maven+Spring+Hibernate+Shiro+Mysql简单的demo框架(二)
然后是项目下的文件:完整的项目请看 上一篇 Maven+Spring+Hibernate+Shiro+Mysql简单的demo框架(一) 项目下的springmvc-servlet.xml配置文件: ...
- Android:PopupWindow简单弹窗改进版
Android:PopupWindow简单弹窗 继续上一节的内容,改进一下,目标是点击菜单后把菜单收缩回去并且切换内容,我使用的是PopupWindow+RadioGroup public class ...
随机推荐
- 策划了个.NET控件的案例大赛
任何一个产品的普及,都有一个过程: 1. 对新事物充满热情.喜欢尝鲜.或后急迫需要的人首先成为产品用户.他们总数很少,但是是产品用户的第一批种子. 2. 思想比较开放.能接受新事物的人会成为第二批用户 ...
- s5pv210中断体系
一.什么是中断? 1.中断的发明是用来解决宏观上的并行需要的.宏观就是从整体上来看,并行就是多件事情都完成了. 2.微观上的并行,就是指的真正的并行,就是精确到每一秒甚至每一刻,多个事情都是在同时进行 ...
- jquery-1.3.2.js
Uncaught SyntaxError: Unexpected identifier
- c++截取英文和汉字(单双字节)混合字符串
在C++里截取字符串可以使用CString.Mid(),可是这个函数只能按英文(单字节)来截取, 如果是汉字可能就要计算好字符个数,如果是汉字和英文混合,那就没辙了. 可是恰好我需要这样一个函数,于是 ...
- python动态获取对象的属性和方法 (转载)
首先通过一个例子来看一下本文中可能用到的对象和相关概念. #coding:utf-8 import sys def foo():pass class Cat(object): def __init__ ...
- 编程风格(Coding Style)要求
编程风格(Coding Style)要求2.1.1 文件(1) 每个模块(module)一般应存在于单独的源文件中,通常源文件名与所包含模块名相同.(2) 每个设计文件开头应包含如下注释内容:? 年份 ...
- [转载] Android Bander设计与实现 - 设计篇
本文转载自: http://blog.csdn.net/chenxiancool/article/details/17454593 摘要 Binder是Android系统进程间通信(IPC)方式之一. ...
- cocos2d-x学习
http://www.cocos2d-x.org/wiki/How_to_Start_A_New_Cocos2D-X_Game Cocos2d-x版本:cocos2d-x-3.6 一.设置脚本参数 1 ...
- NLP学术组织、会与论文
1. 自然语言处理怎么最快入门? 2. 初学者如何查阅自然语言处理(NLP)领域学术资料 2.0 ACL Anthology 2.1 Association for Computational L ...
- TOMCAT的安装部署配置(配图解)
TOMCAT的安装部署配置 前提已经成功搭建配置JDK 下载好压缩包后,直接解压至某一目录下,目录中不能包含中文 双击安装文件,出现如下界面 点击[NEXT],出现如下界面 点击[I AGREE],出 ...