android知识回顾----观察者模式理解和举例

实例1:

型运用是大家熟悉的BaseAdapter,BaseAdapter关联了一个DataSetObservable对象,并实现registerDataSetObserver和unregisterDataSetObserver两个方法实现注册和撤销Observer,方法notifyDataSetChanged间接调用Observer的实现者的onChange()方法,以达到通知数据改变的作用。使用ListView和BaseAdapter组合时,当BaseAdapter的item改变时,我们经常会调用notifyDataSetChanged(),通知Listview刷新。

但是,但是,但是,我们从来没有调用BaseAdapter的registerDataSetObserver(DataSetObserver observer)注册Observer,那么Listview如何接收到通知,并执行刷新动作呢?

当我们setAdapter(ListAdapter adapter)时,BaseAdapter同时注册了AdapterDataSetObserver(),至于AdapterDataSetObserver是如何通知Listvew和每个子item刷新(invalidate)的,这里涉及到的内容已经超出文章的范围,具体请查看源码。





实例2:




android的app程序退出有几种方式:activity队列方式、广播方式。在这里介绍一下我实现该功能的方式--观察者模式。 

    方法的大概思路为:建立Activity基类,实现观察者接口,实现监听方法,finish掉本实例;在Application里面单例一个目标对象,当需要关闭程序的时候,调用目标对象的通知方法,通知所有观察者。 
    代码如下: 
观察者接口  
Java代码   收藏代码
  1. public interface Observer {  
  2.     public void update(Subject subject);  
  3. }  

目标对象基类  
Java代码   收藏代码
  1. public class Subject {  
  2.     private List<Observer> observers = new ArrayList<Observer>();  
  3.       
  4.     public void attach(Observer observer){  
  5.         observers.add(observer);  
  6.     }  
  7.   
  8.     public void detach(Observer observer){  
  9.         observers.remove(observer);  
  10.     }  
  11.       
  12.     protected void notifyObservers(){  
  13.         for(Observer observer : observers){  
  14.             observer.update(this);  
  15.         }  
  16.     }  
  17. }  

目标对象子类(实现具体退出方法)  
Java代码   收藏代码
  1. public class ApplicationSubject extends Subject {  
  2.     public void exit(){  
  3.         notifyObservers();  
  4.     }  
  5. }  

MyApplication类(在Manifest文件中将标签application的name改为本类的全限定名)  
Java代码   收藏代码
  1. public class MyApplication extends Application {  
  2.   
  3.     private static ApplicationSubject applicationSubject;  
  4.       
  5.     public ApplicationSubject getApplicationSubject() {  
  6.                 if(applicationSubject == null) applicationSubject = new ApplicationSubject();  
  7.         return applicationSubject;  
  8.     }  
  9.       
  10. }  


Activity基类  
Java代码   收藏代码
  1. public abstract class BaseActivity extends Activity implements Observer {  
  2.   
  3.     public MyApplication app;  
  4.   
  5.     @Override  
  6.     protected void onCreate(Bundle savedInstanceState) {  
  7.         // TODO Auto-generated method stub  
  8.         super.onCreate(savedInstanceState);  
  9.         app = (MyApplication) this.getApplication();  
  10.         app.getApplicationSubject().attach(this);  
  11.     }  
  12.   
  13.     @Override  
  14.     public void finish() {  
  15.         // TODO Auto-generated method stub  
  16.                 app.getApplicationSubject().detach(this);  
  17.         super.finish();  
  18.     }  
  19.   
  20.     /** 
  21.      * 关闭程序 
  22.      */  
  23.     public void close() {  
  24.         app.getApplicationSubject().exit();  
  25.     };  
  26.       
  27.     @Override  
  28.     public void update(Subject subject) {  
  29.         // TODO Auto-generated method stub  
  30.         this.finish();  
  31.     }  
  32.       
  33. }  


写几个测试页面测试一下  
Java代码   收藏代码
  1. public class ATestActivity extends BaseActivity {  
  2.     @Override  
  3.     protected void onCreate(Bundle savedInstanceState) {  
  4.         // TODO Auto-generated method stub  
  5.         super.onCreate(savedInstanceState);  
  6.         startActivity(new Intent(this, BTestActivity.class));  
  7.     }  
  8. }  
  9. public class BTestActivity extends BaseActivity {  
  10.     @Override  
  11.     protected void onCreate(Bundle savedInstanceState) {  
  12.         // TODO Auto-generated method stub  
  13.         super.onCreate(savedInstanceState);  
  14.         close(); //在BTestActivity中调用close方法,发现A和B都关闭了  
  15.     }  
  16. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值