关闭

[置顶] Android中的观察者DataSetObservable和DataSetObserver

12225人阅读 评论(3) 收藏 举报
分类:

   Observable是观察者模式的典型应用。在Android下,Observable是一个泛型的抽象类,表示一个观察者对象,提供了观察者注册、反注册及清空三个方法,其源码如下:

[java] view plaincopy
  1. public abstract class Observable<T> {  
  2.   
  3.     protected final ArrayList<T> mObservers = new ArrayList<T>();  
  4.   
  5.     public void registerObserver(T observer) {  
  6.         if (observer == null) {  
  7.             throw new IllegalArgumentException("The observer is null.");  
  8.         }  
  9.         synchronized(mObservers) {  
  10.             if (mObservers.contains(observer)) {  
  11.                 throw new IllegalStateException("Observer " + observer + " is already registered.");  
  12.             }  
  13.             mObservers.add(observer);  
  14.         }  
  15.     }  
  16.   
  17.     public void unregisterObserver(T observer) {  
  18.         if (observer == null) {  
  19.             throw new IllegalArgumentException("The observer is null.");  
  20.         }  
  21.         synchronized(mObservers) {  
  22.             int index = mObservers.indexOf(observer);  
  23.             if (index == -1) {  
  24.                 throw new IllegalStateException("Observer " + observer + " was not registered.");  
  25.             }  
  26.             mObservers.remove(index);  
  27.         }  
  28.     }  
  29.   
  30.     public void unregisterAll() {  
  31.         synchronized(mObservers) {  
  32.             mObservers.clear();  
  33.         }          
  34.     }  
  35. }  
     Observable的直接继承者有两个:DataSetObservable和ContentObservable。ContentObservable实现比较复杂,不过功能与DataSetObservable类似,这里只讲解DataSetObservable。

DataSetObservable在很多的Adapter中都用到,像BaseAdapter。DataSetObservable使用DataSetObserver实例化了Observable。DataSetObserver表示了一个数据集对象的观察者,主要提供了两个方法:

[java] view plaincopy
  1. public abstract class DataSetObserver {  
  2.   
  3.     public void onChanged() {  
  4.         // Do nothing  
  5.     }  
  6.   
  7.     public void onInvalidated() {  
  8.         // Do nothing  
  9.     }  
  10. }  

DataSetObservable实现如下:

[java] view plaincopy
  1. public class DataSetObservable extends Observable<DataSetObserver> {  
  2.   
  3.     public void notifyChanged() {  
  4.         synchronized(mObservers) {  
  5.             for (DataSetObserver observer : mObservers) {  
  6.                 observer.onChanged();  
  7.             }  
  8.         }  
  9.     }  
  10.   
  11.     public void notifyInvalidated() {  
  12.         synchronized (mObservers) {  
  13.             for (DataSetObserver observer : mObservers) {  
  14.                 observer.onInvalidated();  
  15.             }  
  16.         }  
  17.     }  
  18. }  

当数据集有变化时,会调用DataSetObserver的onChanged()方法;当数据集失效时,会调用DataSetObserver的onINvalidated()方法。
2
1

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1711471次
    • 积分:14962
    • 等级:
    • 排名:第818名
    • 原创:150篇
    • 转载:265篇
    • 译文:2篇
    • 评论:253条
    最新评论