DataSetObserver猜想觀察者模式


frameworks/base/core/java/android/database/DataSetObserver.java

此類的所有代碼為:

public abstract class DataSetObserver{

    public void onChanged(){}

    public void onInvalidated(){}

}

我在想,誰調用onChanged呢?對於觀察者,當數據變動時調用onChanged()吧,那應該有數據變動的地方,insert / update /delete

frameworks/base/core/java/android/widget/AdapterView.java內部類AdapterDataSetObserver繼承了此類,但它也只是重寫了此類中的兩個方法,沒有寫調用關系。

 

frameworks/base/core/java/android/database/DataSetObserverable.java

此類的所有代碼

DataSetObserverable
public class DataSetObservable extends Observable<DataSetObserver> {
    /** 
     * Invokes onChanged on each observer. Called when the data set being observed has
     * changed, and which when read contains the new state of the data.
     */
    public void notifyChanged() {
        synchronized(mObservers) {
            for (DataSetObserver observer : mObservers) {
                observer.onChanged();
            }   
        }   
    }   

    /** 
     * Invokes onInvalidated on each observer. Called when the data set being monitored
     * has changed such that it is no longer valid.
     */
    public void notifyInvalidated() {
        synchronized (mObservers) {
            for (DataSetObserver observer : mObservers) {
                observer.onInvalidated();
            }   
        }   
    }
}

 

Observable
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);
        }
...
}

 

BaseAdapter
public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {
    private final DataSetObservable mDataSetObservable = new DataSetObservable();

    public boolean hasStableIds() {
        return false;
    }
    
    public void registerDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.registerObserver(observer);
    }

    public void unregisterDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.unregisterObserver(observer);
    }
    
    /**
     * Notifies the attached View that the underlying data has been changed
     * and it should refresh itself.
     */
    public void notifyDataSetChanged() {
        mDataSetObservable.notifyChanged();
    }
    
    public void notifyDataSetInvalidated() {
        mDataSetObservable.notifyInvalidated();
    }
...
}

從類BaseAdapter中看,這里的注冊和通知動作都是通過DataSetObservable對象的,而DataSetObservable繼承了Observable<DataSetObserver>。

 因此,要查找那些繼承自BaseAdapter,又重寫了DataSetObserver的onChanged的函數。

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM