android Observable(观察者)的定义

1.android Observable(观察者)设计模式,原始的观察者类定义在路径frameworks\base\core\java\android\database\Observable.java中
具体如下:

package android.database;

import java.util.ArrayList;

 

public abstract class Observable<T> { //一个泛型

  protected final ArrayList<T> mObservers = new ArrayList<T>(); //泛型类型的数组,用于保存观察者成员对象

  public void registerObserver(T observer) {

    if (observer == null) {

     throw new IllegalArgumentException("The observer is null.");

    }

    synchronized(mObservers) {

       if (mObservers.contains(observer)) {

        throw new IllegalStateException("Observer " + observer + " is already registered.");

      }

       mObservers.add(observer);

    }

public void unregisterObserver(T observer) {
if (observer == null) {

throw new IllegalArgumentException("The observer is null.");
}

synchronized(mObservers) {
int index = mObservers.indexOf(observer);
if (index == -1) {

throw new IllegalStateException("Observer " + observer + " was not registered.");
}
mObservers.remove(index);
}

   

public void unregisterAll() {
  synchronized(mObservers) {
  mObservers.clear();
 }
}

}

观察者模式其实很简单,这里就是用注册函数把观察者成员加载到数组mObservers,就那么简单,这个类是泛型类型的,可以被扩展成注册任何类型的观察者,继承基类Observable的子类将会明确Observable<T>中T的类型。

2.下面是一个DataSetObservable观察者设计模式,它继承了基类Observable,明确了观察者成员的类型,如下:

package android.database;

 

public class DataSetObservable extends Observable<DataSetObserver> { //这里明确观察者成员的类型,是DataSetObserver

public void notifyChanged() {
synchronized(mObservers) {

 for (int i = mObservers.size() - 1; i >= 0; i--) {
 mObservers.get(i).onChanged();
  }
 }
}

public void notifyInvalidated() {
synchronized (mObservers) {

for (int i = mObservers.size() - 1; i >= 0; i--) {
mObservers.get(i).onInvalidated();
  }
  }
}

}

从上面可以看到,DataSetObservable 和Observable<T>几乎是一样的,除了明确观察者成员类型,其他的上面都没做,在这里可以发现,观察者成员是有onChanged()和onInvalidated()这两个方法的,所以类DataSetObserver是什么样的,就差不多可以知道了,至少要有onChanged()和onInvalidated()这两个方法的。

3.class DataSetObserver究竟是啥样?如下:

package android.database;

 

public abstract class DataSetObserver {

  

   public void onChanged() {
     // Do nothing
   }

   

    public void onInvalidated() {
       // Do nothing
    }

}

没错,只有这么两个方法,而且是do nothing,老祖宗就是不一样呀,什么都不用做了,同时它并不知道子子孙孙都要做些什么,所以在这里它就清闲了,所以说,继承DataSetObserver的类,如果想实时更新数据的话,就要重新定义这两个函数了。

观察者一般运用在一对多的,需要实时更新数据的情况下,比如一个音乐播放器的listview在一些音乐数据被删除了以后,需要实时更新最新的数据,那么这个时候观察者是很好的选择。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值