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并不支持跨进程调用
阅读全文
1 0
- DataSetObservable,ContentObservable源码分析
- DataSetObservable,Observable<T>,DataSetObserver源码注释翻译
- Android中的观察者DataSetObservable和DataSetObserver
- Android中的观察者DataSetObservable和DataSetObserver
- 源码分析
- 源码分析
- 源码分析
- 源码分析
- 源码分析
- 源码分析
- 源码分析
- 源码分析
- 源码分析:SparseArray分析
- Android中的设计模式——DataSetObservable 观察者模式
- 源码- Spark Broadcast源码分析
- Android源码/框架源码分析
- 【Android应用源码分析】HandlerThread 源码分析
- 【Android应用源码分析】IntentService 源码分析
- Java实现获取前/后N天,跨度M,的日期/月份期的函数
- 快速排序
- 工具类NetUtil
- 检查是否为BST
- [CCFwithAxin]201412-2 Z字形扫描(类似蛇形矩阵)
- DataSetObservable,ContentObservable源码分析
- 【Java开发工具】IntelliJ IDEA 快捷键和设置
- Python爬虫之爬取动态页面数据
- js零散知识
- 这是我个人的学习经验
- windows bat文件去掉请按任意键继续的文字
- 基数排序
- Vue2.0子同级组件之间数据交互
- spring简介