Observable是观察者模式的典型应用。在Android下,Observable是一个泛型的抽象类,表示一个观察者对象,提供了观察者注册、反注册及清空三个方法,其源码如下:
- publicabstractclassObservable<T>{
- protectedfinalArrayList<T>mObservers=newArrayList<T>();
- publicvoidregisterObserver(Tobserver){
- if(observer==null){
- thrownewIllegalArgumentException("Theobserverisnull.");
- }
- synchronized(mObservers){
- if(mObservers.contains(observer)){
- thrownewIllegalStateException("Observer"+observer+"isalreadyregistered.");
- }
- mObservers.add(observer);
- }
- }
- publicvoidunregisterObserver(Tobserver){
- if(observer==null){
- thrownewIllegalArgumentException("Theobserverisnull.");
- }
- synchronized(mObservers){
- intindex=mObservers.indexOf(observer);
- if(index==-1){
- thrownewIllegalStateException("Observer"+observer+"wasnotregistered.");
- }
- mObservers.remove(index);
- }
- }
- publicvoidunregisterAll(){
- synchronized(mObservers){
- mObservers.clear();
- }
- }
- }
DataSetObservable在很多的Adapter中都用到,像BaseAdapter。DataSetObservable使用DataSetObserver实例化了Observable。DataSetObserver表示了一个数据集对象的观察者,主要提供了两个方法:
- publicabstractclassDataSetObserver{
- publicvoidonChanged(){
- //Donothing
- }
- publicvoidonInvalidated(){
- //Donothing
- }
- }
DataSetObservable实现如下:
- publicclassDataSetObservableextendsObservable<DataSetObserver>{
- publicvoidnotifyChanged(){
- synchronized(mObservers){
- for(DataSetObserverobserver:mObservers){
- observer.onChanged();
- }
- }
- }
- publicvoidnotifyInvalidated(){
- synchronized(mObservers){
- for(DataSetObserverobserver:mObservers){
- observer.onInvalidated();
- }
- }
- }
- }
当数据集有变化时,会调用DataSetObserver的onChanged()方法;当数据集失效时,会调用DataSetObserver的onINvalidated()方法。