观察者模式就是:当一个对象的状态发送改变时,所有依赖于它的对象都能得到通知并被自动更新。

下面介绍一种简单的使用方法,(下面有demo链接)先看一下project的目录构成:

ObserverListener是观察者接口,SubjectListener是被观察者接口,ObserverManager是观察者的管理类。

  1. /**
  2. * Created by Administrator on 2016/9/28.
  3. * 观察者接口
  4. */
  5.  
  6. public interface ObserverListener {
  7. void observerUpData(String content);//刷新操作
  8. }
  1. /**
  2. * Created by Administrator on 2016/9/28.
  3. * 被观察者接口
  4. */
  5.  
  6. public interface SubjectListener {
  7. void add(ObserverListener observerListener);
  8. void notifyObserver(String content);
  9. void remove(ObserverListener observerListener);
  10. }

下面是比较重要的管理类:

  1. public class ObserverManager implements SubjectListener {
  2. private static ObserverManager observerManager;
  3. //观察者接口集合
  4. private List<ObserverListener> list = new ArrayList<>();
  5.  
  6. /**
  7. * 单例
  8. */
  9. public static ObserverManager getInstance(){
  10. if (null == observerManager){
  11. synchronized (ObserverManager.class){
  12. if (null == observerManager){
  13. observerManager = new ObserverManager();
  14. }
  15. }
  16. }
  17. return observerManager;
  18. }
  19.  
  20. /**
  21. * 加入监听队列
  22. */
  23. @Override
  24. public void add(ObserverListener observerListener) {
  25. list.add(observerListener);
  26. }
  27.  
  28. /**
  29. * 通知观察者刷新数据
  30. */
  31. @Override
  32. public void notifyObserver(String content) {
  33. for (ObserverListener observerListener : list){
  34. observerListener.observerUpData(content);
  35. }
  36. }
  37.  
  38. /**
  39. * 监听队列中移除
  40. */
  41. @Override
  42. public void remove(ObserverListener observerListener) {
  43. if (list.contains(observerListener)){
  44. list.remove(observerListener);
  45. }
  46. }
  47. }

效果是当点击ThirdActivity中的按钮时,执行ObserverManager.getInstance().notifyObserver("观察者请刷新信息");

然后所有添加到监听队列的Activity都会更新数据,ObserverManager.getInstance().add(this)就是添加到监听队列的方法,更新操作执行在observerUpData(String content)方法中。

下面是3个Activity,很简单:

  1. public class MainActivity extends AppCompatActivity implements ObserverListener {
  2. private TextView textView;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_main);
  7. textView = (TextView) findViewById(R.id.tv);
  8. findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
  9. @Override
  10. public void onClick(View v) {
  11. //ObserverManager.getInstance().notifyObserver("观察者请刷新信息");
  12. Intent intent = new Intent(MainActivity.this,SecondActivity.class);
  13. startActivity(intent);
  14. }
  15. });
  16.  
  17. //注册
  18. ObserverManager.getInstance().add(this);
  19.  
  20. }
  21.  
  22. @Override
  23. public void observerUpData(String content) {
  24. Log.d("vvvvvvvvvvvvvvv","11111111111");
  25. textView.setText(content);
  26. }
  27. }
  1. public class SecondActivity extends AppCompatActivity implements ObserverListener {
  2. private TextView textView;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_second);
  7. textView = (TextView) findViewById(R.id.tv2);
  8. findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() {
  9. @Override
  10. public void onClick(View v) {
  11. Intent intent = new Intent(SecondActivity.this,ThirdActivity.class);
  12. startActivity(intent);
  13. }
  14. });
  15.  
  16. //注册
  17. ObserverManager.getInstance().add(this);
  18. }
  19.  
  20. @Override
  21. public void observerUpData(String content) {
  22. Log.d("vvvvvvvvvvvvvvv","2222222222");
  23. textView.setText(content);
  24. }
  25. }
  1. public class ThirdActivity extends AppCompatActivity implements ObserverListener {
  2. private TextView textView;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_third);
  7. textView = (TextView) findViewById(R.id.tv3);
  8. findViewById(R.id.btn3).setOnClickListener(new View.OnClickListener() {
  9. @Override
  10. public void onClick(View v) {
  11. ObserverManager.getInstance().notifyObserver("观察者请刷新信息");
  12. }
  13. });
  14.  
  15. //注册
  16. ObserverManager.getInstance().add(this);
  17. }
  18.  
  19. @Override
  20. public void observerUpData(String content) {
  21. Log.d("vvvvvvvvvvvvvvv","33333333333");
  22. textView.setText(content);
  23. }
  24. }

布局都是一个TextView和一个Button。

demo链接http://yun.baidu.com/share/link?shareid=2719259515&uk=1969594477

Android观察者模式的简单实现demo的更多相关文章

  1. ESA2GJK1DH1K基础篇: Android连接MQTT简单的Demo

    题外话 我老爸也问我物联网发展的趋势是什么!!!!!! 我自己感觉的:(正在朝着 "我,机器人" 这部电影的服务器方向发展) 以后的设备都会和服务器交互,就是说本地不再做处理,全部 ...

  2. I.MX6 Android backlight modify by C demo

    /************************************************************************** * I.MX6 Android backligh ...

  3. Android -BLE蓝牙小DEMO

    代码地址如下:http://www.demodashi.com/demo/13890.html 原文地址: https://blog.csdn.net/vnanyesheshou/article/de ...

  4. [Android]RecyclerView的简单演示样例

    去年google的IO上就展示了一个新的ListView.它就是RecyclerView. 下面是官方的说明,我英语能力有限,只是我大概这么理解:RecyclerView会比ListView更具有拓展 ...

  5. Android中Service的一个Demo例子

    Android中Service的一个Demo例子  Service组件是Android系统重要的一部分,网上看了代码,很简单,但要想熟练使用还是需要Coding.  本文,主要贴代码,不对Servic ...

  6. C#可扩展编程之MEF学习笔记(一):MEF简介及简单的Demo

    在文章开始之前,首先简单介绍一下什么是MEF,MEF,全称Managed Extensibility Framework(托管可扩展框架).单从名字我们不难发现:MEF是专门致力于解决扩展性问题的框架 ...

  7. Android HandlerThread 的使用及其Demo

    今天我们一起来学习下一个Android中比较简单的类HandlerThread,虽然它的初始化有点小麻烦. 介绍 首先我们来看看为什么我们要使用HandlerThread?在我们的应用程序当中为了实现 ...

  8. Maven+Spring+Hibernate+Shiro+Mysql简单的demo框架(二)

    然后是项目下的文件:完整的项目请看  上一篇 Maven+Spring+Hibernate+Shiro+Mysql简单的demo框架(一) 项目下的springmvc-servlet.xml配置文件: ...

  9. Android:PopupWindow简单弹窗改进版

    Android:PopupWindow简单弹窗 继续上一节的内容,改进一下,目标是点击菜单后把菜单收缩回去并且切换内容,我使用的是PopupWindow+RadioGroup public class ...

随机推荐

  1. 策划了个.NET控件的案例大赛

    任何一个产品的普及,都有一个过程: 1. 对新事物充满热情.喜欢尝鲜.或后急迫需要的人首先成为产品用户.他们总数很少,但是是产品用户的第一批种子. 2. 思想比较开放.能接受新事物的人会成为第二批用户 ...

  2. s5pv210中断体系

    一.什么是中断? 1.中断的发明是用来解决宏观上的并行需要的.宏观就是从整体上来看,并行就是多件事情都完成了. 2.微观上的并行,就是指的真正的并行,就是精确到每一秒甚至每一刻,多个事情都是在同时进行 ...

  3. jquery-1.3.2.js

    Uncaught SyntaxError: Unexpected identifier

  4. c++截取英文和汉字(单双字节)混合字符串

    在C++里截取字符串可以使用CString.Mid(),可是这个函数只能按英文(单字节)来截取, 如果是汉字可能就要计算好字符个数,如果是汉字和英文混合,那就没辙了. 可是恰好我需要这样一个函数,于是 ...

  5. python动态获取对象的属性和方法 (转载)

    首先通过一个例子来看一下本文中可能用到的对象和相关概念. #coding:utf-8 import sys def foo():pass class Cat(object): def __init__ ...

  6. 编程风格(Coding Style)要求

    编程风格(Coding Style)要求2.1.1 文件(1) 每个模块(module)一般应存在于单独的源文件中,通常源文件名与所包含模块名相同.(2) 每个设计文件开头应包含如下注释内容:? 年份 ...

  7. [转载] Android Bander设计与实现 - 设计篇

    本文转载自: http://blog.csdn.net/chenxiancool/article/details/17454593 摘要 Binder是Android系统进程间通信(IPC)方式之一. ...

  8. cocos2d-x学习

    http://www.cocos2d-x.org/wiki/How_to_Start_A_New_Cocos2D-X_Game Cocos2d-x版本:cocos2d-x-3.6 一.设置脚本参数 1 ...

  9. NLP学术组织、会与论文

    1. 自然语言处理怎么最快入门? 2. 初学者如何查阅自然语言处理(NLP)领域学术资料 2.0  ACL Anthology 2.1  Association for Computational L ...

  10. TOMCAT的安装部署配置(配图解)

    TOMCAT的安装部署配置 前提已经成功搭建配置JDK 下载好压缩包后,直接解压至某一目录下,目录中不能包含中文 双击安装文件,出现如下界面 点击[NEXT],出现如下界面 点击[I AGREE],出 ...