首页 > 代码库 > android里的观察者模式
android里的观察者模式
状况:遇到android程序中后入栈的一个Activity需要更新之前一个或者两个以上Activity中的数据时使用
[1].[代码] [Java]代码 跳至 [1]
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | /* 观察者 */ 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()); |
android里的观察者模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。