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中的最新數據。