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
此類的所有代碼

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(); } } } }

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

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的函數。