- /* 观察者 */
- 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());
- //该片段来自于http://www.codesnippet.cn/detail/1012201411225.html
来源: http://www.codesnippet.cn/detail/1012201411225.html