星期一, 4月 30, 2012

ContentObserver, 觀察 ContentProvider 的更新

當我們需要對 ContentProvider 的內容更新做出即時的反應,可以用 ContentObserver 來達到監控的效果。

用起來還蠻簡單的,實做一個 ContentObserver 以後,用 ContentResolver 來註冊一個 observer。
private class MyObserver extends ContentObserver {
 public MyObserver(Handler handler)
 {
  super(handler);
 }

 /**
  * {@inheritDoc}
  * @see ContentObserver#onChange(boolean)
  */
 public void onChange(boolean selfChange)
 {
  Log.d("MyObserver", String.format("onChange: %s", selfChange?"1":"0"));
 }
}
ContentResolver cr = getContentResolver();
cr.registerContentObserver(Events.CONTENT_URI, false,
 new MyObserver(new Handler()));

Observer 中除了 constructor,我們只要 override onChange 就可以了。當目標內容有改變並通知時,onChange 就會被呼叫。

有個問題是,我不知道為什麼我實際上在使用的時候,每次資料有變更 onChange 都會被呼叫兩次。目前因為資料的變動週期不短,所以我對每個 onChange 都做出反應不會有什麼問題,但是如果遇到資料更新頻率很高的應用時,也許可以配合 PendingIntent (FLAG_UPDATE_CURRENT, FLAG_NO_CREATE) 來做延後的合併處理。

沒有留言: