DataSetObservable,ContentObservable源码分析

来源:互联网 发布:遗传算法bp神经网络 编辑:程序博客网 时间:2024/06/01 09:48

经常使用ListView的时候,使用Adapter刷新数据是回调用notifyDataSetChanged()方法其实notifyDataSetChanged()调用的是

public void notifyDataSetChanged() {    mDataSetObservable.notifyChanged();}
也就是 DataSetObservable的notifyChanged()

顺手研究了以下他的原理发现它使用的是DataSetObservable 比较简单的一个类,研究此类前先介绍一下他的父类Observable也比较简单.

在这里特别提醒一句此类是   android.database 包中的Observable 而不是java.util.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);        }    }    /**     * 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();        }    }}
此类就提供了注册和解注册的方法,比较简单.用来通知所有注册过DataSetObserver或者其子类,ListViwe就是用了AdapterDataSetObserver  通过搜索可能搜不到,因为他是ListViwe的父类AbsListView的一个内部类

public class DataSetObservable extends Observable<DataSetObserver> {    /**     * Invokes {@link DataSetObserver#onChanged} on each observer.     * Called when the contents of the data set have changed.  The recipient     * will obtain the new contents the next time it queries the data set.     */    public void notifyChanged() {        synchronized(mObservers) {            // since onChanged() is implemented by the app, it could do anything, including            // removing itself from {@link mObservers} - and that could cause problems if            // an iterator is used on the ArrayList {@link mObservers}.            // to avoid such problems, just march thru the list in the reverse order.            for (int i = mObservers.size() - 1; i >= 0; i--) {                mObservers.get(i).onChanged();            }        }    }    /**     * Invokes {@link DataSetObserver#onInvalidated} on each observer.     * Called when the data set is no longer valid and cannot be queried again,     * such as when the data set has been closed.     */    public void notifyInvalidated() {        synchronized (mObservers) {            for (int i = mObservers.size() - 1; i >= 0; i--) {                mObservers.get(i).onInvalidated();            }        }    }}
DataSetObserver这个类就更简单了,就两个回调方法进行通知.

public abstract class DataSetObserver {    /**     * This method is called when the entire data set has changed,     * most likely through a call to {@link Cursor#requery()} on a {@link Cursor}.     */    public void onChanged() {        // Do nothing    }    /**     * This method is called when the entire data becomes invalid,     * most likely through a call to {@link Cursor#deactivate()} or {@link Cursor#close()} on a     * {@link Cursor}.     */    public void onInvalidated() {        // Do nothing    }}

Observable 还有一个子类 ContentObservable和DataSetObservable原理差不多也比较简单

public class ContentObservable extends Observable<ContentObserver> {    @Override    public void registerObserver(ContentObserver observer) {        super.registerObserver(observer);    }    @Deprecated    public void dispatchChange(boolean selfChange) {        dispatchChange(selfChange, null);    }    public void dispatchChange(boolean selfChange, Uri uri) {        synchronized(mObservers) {            for (ContentObserver observer : mObservers) {                if (!selfChange || observer.deliverSelfNotifications()) {                    observer.dispatchChange(selfChange, uri);                }            }        }    }    @Deprecated    public void notifyChange(boolean selfChange) {        synchronized(mObservers) {            for (ContentObserver observer : mObservers) {                observer.onChange(selfChange, null);            }        }    }}
但是它通过ContentObserver去回调这个类比较丰富一点,并且支持了跨进程调用,但是都是隐藏方法

public abstract class ContentObserver {    private final Object mLock = new Object();    private Transport mTransport; // guarded by mLock    Handler mHandler;    public ContentObserver(Handler handler) {        mHandler = handler;    }    /**     * Gets access to the binder transport object. Not for public consumption.     *     * {@hide}     */    public IContentObserver getContentObserver() {        synchronized (mLock) {            if (mTransport == null) {                mTransport = new Transport(this);            }            return mTransport;        }    }    /**     * Gets access to the binder transport object, and unlinks the transport object     * from the ContentObserver. Not for public consumption.     *     * {@hide}     */    public IContentObserver releaseContentObserver() {        synchronized (mLock) {            final Transport oldTransport = mTransport;            if (oldTransport != null) {                oldTransport.releaseContentObserver();                mTransport = null;            }            return oldTransport;        }    }      public boolean deliverSelfNotifications() {        return false;    }    public void onChange(boolean selfChange) {        // Do nothing.  Subclass should override.    }      public void onChange(boolean selfChange, Uri uri) {        onChange(selfChange);    }    /**     * Dispatches a change notification to the observer. Includes the changed     * content Uri when available and also the user whose content changed.     *     * @param selfChange True if this is a self-change notification.     * @param uri The Uri of the changed content, or null if unknown.     * @param userId The user whose content changed. Can be either a specific     *         user or {@link UserHandle#USER_ALL}.     *     * @hide     */    public void onChange(boolean selfChange, Uri uri, int userId) {        onChange(selfChange, uri);    }    /**     * Dispatches a change notification to the observer.     * <p>     * If a {@link Handler} was supplied to the {@link ContentObserver} constructor,     * then a call to the {@link #onChange} method is posted to the handler's message queue.     * Otherwise, the {@link #onChange} method is invoked immediately on this thread.     * </p>     *     * @param selfChange True if this is a self-change notification.     *     * @deprecated Use {@link #dispatchChange(boolean, Uri)} instead.     */    @Deprecated    public final void dispatchChange(boolean selfChange) {        dispatchChange(selfChange, null);    }     public final void dispatchChange(boolean selfChange, Uri uri) {        dispatchChange(selfChange, uri, UserHandle.getCallingUserId());    }    private void dispatchChange(boolean selfChange, Uri uri, int userId) {        if (mHandler == null) {            onChange(selfChange, uri, userId);        } else {            mHandler.post(new NotificationRunnable(selfChange, uri, userId));        }    }    private final class NotificationRunnable implements Runnable {        private final boolean mSelfChange;        private final Uri mUri;        private final int mUserId;        public NotificationRunnable(boolean selfChange, Uri uri, int userId) {            mSelfChange = selfChange;            mUri = uri;            mUserId = userId;        }        @Override        public void run() {            ContentObserver.this.onChange(mSelfChange, mUri, mUserId);        }    }    private static final class Transport extends IContentObserver.Stub {        private ContentObserver mContentObserver;        public Transport(ContentObserver contentObserver) {            mContentObserver = contentObserver;        }        @Override        public void onChange(boolean selfChange, Uri uri, int userId) {            ContentObserver contentObserver = mContentObserver;            if (contentObserver != null) {                contentObserver.dispatchChange(selfChange, uri, userId);            }        }        public void releaseContentObserver() {            mContentObserver = null;        }    }}

但是在这明确一点DataSetObservable和ContentObservable并不支持跨进程调用









原创粉丝点击