Android應用程序組件Content Provider的共享數據更新通知機制分析(4)

       Step 4. Transport.onChange
        這個函數定義在frameworks/base/core/java/android/database/ContentObserver.java文件中:
  1. public abstract class ContentObserver {  
  2.     ......  
  3.   
  4.     private static final class Transport extends IContentObserver.Stub {  
  5.         ContentObserver mContentObserver;  
  6.       
  7.         ......  
  8.   
  9.         public void onChange(boolean selfChange) {  
  10.             ContentObserver contentObserver = mContentObserver;  
  11.             if (contentObserver != null) {  
  12.                 contentObserver.dispatchChange(selfChange);  
  13.             }  
  14.         }  
  15.   
  16.         ......  
  17.     }  
  18.   
  19.     ......  
  20. }  
        前面咱們在分析ContentObserver的註冊過程的Step 3時,把ArticlesObserver這個ContentObserver保存在了這個Transport對象的mContentObserver成員變量中,所以,會調用它的dispatchChange函數來執行數據更新通知的操做。
 
        Step 5. ContentObserver.dispatchChange
        這個函數定義在frameworks/base/core/java/android/database/ContentObserver.java文件中:
  1. public abstract class ContentObserver {  
  2.     ......  
  3.   
  4.     public final void dispatchChange(boolean selfChange) {  
  5.         if (mHandler == null) {  
  6.             onChange(selfChange);  
  7.         } else {  
  8.             mHandler.post(new NotificationRunnable(selfChange));  
  9.         }  
  10.     }  
  11. }  
        在前面分析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文件中:
  1. public abstract class ContentObserver {  
  2.     ......  
  3.   
  4.     private final class NotificationRunnable implements Runnable {  
  5.         private boolean mSelf;  
  6.   
  7.         public NotificationRunnable(boolean self) {  
  8.             mSelf = self;  
  9.         }  
  10.   
  11.         public void run() {  
  12.             ContentObserver.this.onChange(mSelf);  
  13.         }  
  14.     }  
  15.   
  16.     ......  
  17. }  
        這個函數就直接調用ContentObserver的子類的onChange函數來處理這個數據更新通知了。在咱們這個情景中,這個ContentObserver子類即是ArticlesObserver了。
 
        Step 7. ArticlesObserver.onChange
        這個函數定義在前面一篇文章 Android應用程序組件Content Provider應用實例 介紹的應用程序Artilce源代碼工程目錄下,在文件爲packages/experimental/Article/src/shy/luo/article/MainActivity.java中:
  1. public class MainActivity extends Activity implements View.OnClickListener, AdapterView.OnItemClickListener {  
  2.     ......  
  3.   
  4.     private class ArticleObserver extends ContentObserver {  
  5.         ......  
  6.   
  7.         @Override  
  8.         public void onChange (boolean selfChange) {  
  9.             adapter.notifyDataSetChanged();  
  10.         }  
  11.     }  
  12.   
  13.     ......  
  14. }  
       這裏它要執行的操做即是更新界面上的ListView列表中的文章信息了,以便反映ArticlesProvider中的最新數據。
 
     這樣,Android應用程序組件Content Provider的共享數據更新通知機制就分析完了,整個Android應用程序組件Content Provider的學習也結束了,從新學習請回到 Android應用程序組件Content Provider簡要介紹和學習計劃一文。
相關文章
相關標籤/搜索