Step 4. Transport.onChange
这个函数定义在frameworks/base/core/java/android/database/ContentObserver.java文件中:
-
public abstract class ContentObserver {
-
......
-
-
private static final class Transport extends IContentObserver.Stub {
-
ContentObserver mContentObserver;
-
-
......
-
-
public void onChange(boolean selfChange) {
-
ContentObserver contentObserver = mContentObserver;
-
if (contentObserver != null) {
-
contentObserver.dispatchChange(selfChange);
-
}
-
}
-
-
......
-
}
-
-
......
-
}
前面我们在分析ContentObserver的注册过程的Step 3时,把ArticlesObserver这个ContentObserver保存在了这个Transport对象的mContentObserver成员变量中,因此,会调用它的dispatchChange函数来执行数据更新通知的操作。
Step 5. ContentObserver.dispatchChange
这个函数定义在frameworks/base/core/java/android/database/ContentObserver.java文件中:
-
public abstract class ContentObserver {
-
......
-
-
public final void dispatchChange(boolean selfChange) {
-
if (mHandler == null) {
-
onChange(selfChange);
-
} else {
-
mHandler.post(new NotificationRunnable(selfChange));
-
}
-
}
-
}
在前面分析ArticlesObserver的注册过程时,我们以应用程序Article的主线程的消息循环创建了一个Handler,并且以这个Handler来创建了这个ArticlesObserver,这个Handler就保存在ArticlesObserver的父类ContentObserver的成员变量mHandler中。因此,这里的mHandler不为null,于是把这个数据更新通知封装成了一个消息,放到应用程序Article的主线程中去处理,最终这个消息是由NotificationRunnable类的run函数来处理的。
Step 6. NotificationRunnable.run
这个函数定义在frameworks/base/core/java/android/database/ContentObserver.java文件中:
-
public abstract class ContentObserver {
-
......
-
-
private final class NotificationRunnable implements Runnable {
-
private boolean mSelf;
-
-
public NotificationRunnable(boolean self) {
-
mSelf = self;
-
}
-
-
public void run() {
-
ContentObserver.this.onChange(mSelf);
-
}
-
}
-
-
......
-
}
这个函数就直接调用ContentObserver的子类的onChange函数来处理这个数据更新通知了。在我们这个情景中,这个ContentObserver子类便是ArticlesObserver了。
Step 7. ArticlesObserver.onChange
这个函数定义在前面一篇文章
Android应用程序组件Content Provider应用实例
介绍的应用程序Artilce源代码工程目录下,在文件为packages/experimental/Article/src/shy/luo/article/MainActivity.java中:
-
public class MainActivity extends Activity implements View.OnClickListener, AdapterView.OnItemClickListener {
-
......
-
-
private class ArticleObserver extends ContentObserver {
-
......
-
-
@Override
-
public void onChange (boolean selfChange) {
-
adapter.notifyDataSetChanged();
-
}
-
}
-
-
......
-
}
这里它要执行的操作便是更新界面上的ListView列表中的文章信息了,以便反映ArticlesProvider中的最新数据。
这样,Android应用程序组件Content Provider的共享数据更新通知机制就分析完了,整个Android应用程序组件Content Provider的学习也结束了,重新学习请回到
Android应用程序组件Content Provider简要介绍和学习计划一文。
本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/967022,如需转载请自行联系原作者