代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
Java
】
android里的观察者模式
作者:
李-锦锋
/ 发布于
2013/10/11
/
774
状况:遇到android程序中后入栈的一个Activity需要更新之前一个或者两个以上Activity中的数据时使用
/* 观察者 */ public interface Observer { void update(Object... objs); } /* 被观察者 使用一个抽象类方便扩展 */ public abstract class Observable<T> { public final transient ArrayList<HashMap<String, T>> obserList = new ArrayList<HashMap<String,T>>(); /* 添加观察者 包括名称及本生 */ public void attachObserver(String obName, T ob) { if(obName == null || ob == null) throw new NullPointerException(); synchronized(obserList) { HashMap<String, T> map = new HashMap<String, T>(); map.put(obName, ob); int index = obserList.indexOf(map); if(index == -1) { obserList.add(map); } } } /* 删除观察者 */ public void detachObserver(String obName) { if(obName == null) throw new NullPointerException(); synchronized(obserList){ Iterator<HashMap<String, T>> iteratorMap = obserList.iterator(); while(iteratorMap.hasNext()) { Iterator<Entry<String, T>> iterator = iteratorMap.next().entrySet().iterator(); while(iterator.hasNext()){ if(iterator.next().getKey().equals(obName)){ iteratorMap.remove(); break; } } } } } /** detach all observers */ public void detachObservers() { synchronized(obserList) { obserList.removeAll(obserList); } } /** Ruturn the size of observers */ public int countObservers() { synchronized(obserList) { return obserList.size(); } } public abstract void notifyObservers(); public abstract void notifyObserver(String obserName, boolean flag, Object... objs); } /* 被观察者实例 */ public class CommonObservable<T extends Observer> extends Observable<T> { /* 实现抽象方法通知观察者, 第一个参数为观察者名字,第二个参数flag标志表示如果没有找到观察者是否通知其他所有观察者(true是false否),第三个为需要传递的参数 */ @Override public void notifyObserver(String obserName, boolean flag, Object... objs) { // TODO Auto-generated method stub if(obserName != null && !(obserName instanceof String)) return; for(HashMap<String, T> map : obserList){ if(map.containsKey(obserName)) { ((T)map.get(obserName)).update(objs); break; } } if(flag) { for(HashMap<String, T> map : obserList){ Iterator<Entry<String, T>> iterator = map.entrySet().iterator(); ((T)iterator.next().getValue()).update(objs); } } } @Override public void notifyObservers() { // TODO Auto-generated method stub notifyObserver(null, false, null, null); } } /* 使用实例,如:在点击一个Activity中listview数据后进入另一个Activity,此时对另一个Activity作出改动后需要在不重新从服务器中下载数据后能够看到修改状态 */ public class FireTrainCoursewareActivity extends Activity implements Observer{ @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.firetrain_courseware); /*在oncreate中注册观察者 */ ((BMapApiDemoApp)getApplication()).getCommonObservable().attachObserver("FireTrainCourseware", this); (ListViewImpl)findViewById(R.id.firetarin_courseware_listview); listItem = new ArrayList<HashMap<String,Object>>(); simpleAdapter = new SimpleAdapter(FireTrainCoursewareActivity.this, listItem, R.layout.list_items_peixun, new String[] { "ItemImage", "ItemTitle", "ItemReadTimes","ItemDownloadTimes" }, new int[] { R.id.ItemImage_peixun, R.id.ItemTitle_peixun, R.id.ItemRead_peixun,R.id.ItemLoad_peixun }); listView.setAdapter(simpleAdapter); listView.setOnrefreshListener(this); listView.setOnItemClickListener(this); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); /*最好在ondestory中注销之 */ ((BMapApiDemoApp)getApplication()).getCommonObservable().detachObserver("FireTrainCourseware"); } /* 在update中更新数据 */ @Override public void update(Object... objs) { // TODO Auto-generated method stub mTempList.get(Integer.parseInt(objs[0].toString())).setDownloadTimes(Integer.parseInt(objs[1].toString())); for(int i = 0; i < mAllList.size(); i++) { if(mAllList.get(i).getId() == mAllList.get(Integer.parseInt(objs[0].toString())).getId()) { mAllList.get(i).setDownloadTimes(Integer.parseInt(objs[1].toString())); mAllList.get(i).setReadTimes(mTempList.get(Integer.parseInt(objs[0].toString())).getReadTimes()); } } } } /* 使用观察者实例 在想要修改数据的时候调用notify方法即可 */ ((BMapApiDemoApp)getApplication()).getCommonObservable() .notifyObserver("FireTrainCourseware", false, getIntent().getIntExtra("position", 0), downloadTimes_.getText().toString());
试试其它关键字
观察者
同语言下
.
List 切割成几份 工具类
.
一行一行读取txt的内容
.
Java PDF转换成图片并输出给前台展示
.
java 多线程框架
.
double类型如果小数点后为零则显示整数否则保留两位小
.
将图片转换为Base64字符串公共类抽取
.
sqlParser 处理SQL(增删改查) 替换schema 用于多租户
.
JAVA 月份中的第几周处理 1-7属于第一周 依次类推 29-
.
java计算两个经纬度之间的距离
.
输入时间参数计算年龄
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
李-锦锋
贡献的其它代码
(
3
)
.
shell检查并修复mysql数据库表
.
android里的观察者模式
.
易信 php 验证接口
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3