天天看點

Android觀察者模式Observable的學習(一)

最近做項目,閑來無聊打算自定義一個listadapter,一般常用的是繼承baseadapter來實作裡面的方法。我打算自己定義一個adapter深入學習adapter.

點開adapter的api文檔,發現裡面有一個

void registerDataSetObserver(DataSetObserver observer);
           

方法,遂跟下去看看DataSetObserver點開發現,

public class DataSetObservable extends Observable<DataSetObserver>
           

繼承的是Observable觀察者模式,DataSetObserver正是被觀察者。點開Observable的api如下

package android.database;

import java.util.ArrayList;

/**
 * Provides methods for registering or unregistering arbitrary observers in an {@link ArrayList}.
 *
 * This abstract class is intended to be subclassed and specialized to maintain
 * a registry of observers of specific types and dispatch notifications to them.
 *
 * @param T The observer type.
 */
public abstract class Observable<T> {
    /**
     * The list of observers.  An observer can be in the list at most
     * once and will never be null.
     */
    protected final ArrayList<T> mObservers = new ArrayList<T>();

    /**
     * Adds an observer to the list. The observer cannot be null and it must not already
     * be registered.
     * @param observer the observer to register
     * @throws IllegalArgumentException the observer is null
     * @throws IllegalStateException the observer is already registered
     */
    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);
        }
    }

    /**
     * Removes a previously registered observer. The observer must not be null and it
     * must already have been registered.
     * @param observer the observer to unregister
     * @throws IllegalArgumentException the observer is null
     * @throws IllegalStateException the observer is not yet registered
     */
    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);
        }
    }

    /**
     * Remove all registered observers.
     */
    public void unregisterAll() {
        synchronized(mObservers) {
            mObservers.clear();
        }
    }
}
           

觀察者模式定義:“定義對象間的一種一對多的依賴關系,當一個對象的狀态發生改變的時候,所有依賴于它的對象都将得到通知,并自動更新”,這就是所謂的觀察者模式,照意思了解那麼就一定會有觀察者和被觀察者了,在Java1.2之後,提供了兩個類,即Observable被觀察者,Observer觀察者;

觀察者模式是軟體設計模式的一種。在此種模式中,一個目标物件管理所有相依于它的觀察者物件,并且在它本身的狀态改變時主動發出通知。

實作過程:“注冊——通知——撤銷注冊”

1、觀察者

(Observer)将自己注冊到被觀察對象(Subject)中,被觀察對象将觀察者存放在一個容器(Container)裡。

2、被觀察對象

被觀察對象發生了某種變化,從容器中得到所有注冊過的觀察者,将變化通知觀察者。

在我們的BaseAdapter中,由于繼承了ListAdapter,ListAdapter繼承了Adapter,

是以BaseAdapter實作了registerDataSetObserver注冊觀察者

private final DataSetObservable mDataSetObservable = new DataSetObservable();

public void registerDataSetObserver(DataSetObserver observer) {
    mDataSetObservable.registerObserver(observer);
}
           

而當我們的DataSetObserver被觀察者的資料發生變化時調用,

public void notifyDataSetChanged() {
    mDataSetObservable.notifyChanged();
}
           

方法更新資料。也就是調用了DataSetObservable的notifyChanged方法。

先了解到這裡,繼續做項目。

繼續閱讀