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
-
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中的最新数据。