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

下面介绍一种简单的使用方法,(下面有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的更多相关文章

  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. bool 类型存在数据库中为 0 和 1

    bool 类型存在数据库中为 0 和 1 但是在程序中应该使用  true 和 false 查询. 例如: bIsStart = 0 在数据中bIsStart为 0 sql 查询的时候,使用:sele ...

  2. java中时间比较

    package com.newtouch.test; import java.text.SimpleDateFormat;import java.util.Date; public class Tim ...

  3. Node.js intro

    1. require() load module http://stackoverflow.com/questions/9901082/what-is-this-javascript-require ...

  4. C++STL学习笔记_(1)deque双端数组知识

    #include<iostream> using namespace std; #include "deque" #include "algorithm&qu ...

  5. php 随记

    1. 删除数组里面为空的元素 $arr = [ '1', '0', '', '[]', 'false', 'true', ' ' ]; //以以上的数组为例 $codes = array_filter ...

  6. The path to the driver executable must be set by the webdriver.gecko.driver system property

    报这个错,是因为你使用了selenium3+Firefox.在selenium3中,使用Firefox,需要添加驱动. 您可以从Github上下载驱动程序下载网址-  https://github.c ...

  7. Flash Builder 调试器无法连接到正在运行的应用程序(57%)

    Flash Builder 调试器无法连接到正在运行的应用程序(57%),可能原因:     1,flashplayer不是debug版.     2,调试器(用debug版flashplayer随便 ...

  8. Java(接口与继承)动手动脑

    1>继承条件下的构造方法调用 运行 TestInherits.java 示例,观察输出,注意总结父类与子类之间构造方法的调用关系修改 Parent 构造方法的代码,显式调用 GrandParen ...

  9. 07-JAVA继承与接口

    动手动脑: 源程序: public class FuGai { public static void main(String[] args) { // TODO Auto-generated meth ...

  10. python出输出字符串方式:

    python出输出字符串方式: >>> who='knights' >>> what='NI' >>> print ('we are the',w ...