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

下面介绍一种简单的使用方法,(下面有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. mvc 导入excel表格

    <script> $(function () { $("#Attachment").change(function () { var att = $("#At ...

  2. PHP中的特殊符号

    <?php 注解符号: // 单行注解 /* */ 多行注解 引号的使用 ' ' 单引号,没有任何意义,不经任何处理直接拿过来; " "双引号,php动态处理然后输出,一般用 ...

  3. 小白如何进入IOS,答案就在这里

    ***对于进来看过我博客的博友们,请看一下最后面的几道题,觉得可以的可以自己私下做一下,有不懂的我们可以相互交流*** 现在我来说一下我们IOS需要的基础,现在用的比较多的就是swift语言. 首先, ...

  4. 新学习到的vi的一些命令

    1.普通模式下.符号可以重复上次的命令 2.普通模式下n<command>可以重复n次command命令 3.dw可以删除单个词    dnw可以删除n个单词  x和X可以在普通模式下删除 ...

  5. Tesseract API在VS 2013中的配置以及调用

    [Tesseract]Tesseract API在VS 2013中的配置以及调用 时间:2016-05-31 20:35:19      阅读:127      评论:0      收藏:0      ...

  6. python第十九天-----Django进阶

    1.机智的小django为我你们提供了快捷的表单验证! from django.shortcuts import render, HttpResponse,redirect from django i ...

  7. dbcp数据源配置杂谈

    <!-- 数据源1 --> #驱动信息(driver, url, username, password)driverClassName=net.sourceforge.jtds.jdbc. ...

  8. Android两个子线程之间通信

    Android中,相信主线程和子线程之间的通信大家都不陌生了吧.在一次面试经历中被问到了两个子线程之间是如何进行通信的.哎呦!这可蒙住我了.后来回家研究了下,分享给大家. 其实android中线程通信 ...

  9. python学习之——操作浏览器

    使用selenium的webdriver框架,对浏览器的常规操作,如下~~ #coding=utf-8 from selenium import webdriver import time from ...

  10. gulp插件autoprefixer

    gulp的autoprefixer插件可以根据我们的设置帮助我们自动补全浏览器的前缀(如:-moz.-ms.-webkit.-o) 1)首先安装gulp,不知道怎么安装请看这里 2)安装autopre ...