数据库监听。数据库一次notify,Activity多次接收
今天項目中發現一個bug:
?
(1)當uri數據庫中有更新,會從數據庫層DataService中通知應用層,調用notifyChange:
mContext.getContentResolver().notifyChange(uri, null);
?
(2)Activity中有類DataListener
1 class DataListener extends ContentObserver 2 { 3 4 public DataListener(Handler handler) 5 { 6 super(handler); 7 // TODO Auto-generated constructor stub 8 } 9 10 @Override 11 public void onChange(boolean selfChange) 12 { 13 try 14 { 15 List<ContactDataItem> contactList = DataService.getInstance().getDao(ContactDataItem.class).queryForAll(); 16 Log.d(LogConfig.CONTRACTS_TAG, "data change"); 17 mNeedRefreshContactList = true; 18 mContactsAdapter.setContactList(contactList); 19 notifyDataSetChanged(); 20 } 21 catch (SQLException e) 22 { 23 // TODO Auto-generated catch block 24 e.printStackTrace(); 25 } 26 } 27 }?
Activity中,注冊數據庫監聽
mDataListener = new DataListener(new Handler(this.getMainLooper()));
mContext.getContentResolver().registerContentObserver(uri, false, mDataListener);
?
(3)后來發現,log中DataService通知了一次
==DataService== notifyChange ?Uri??content://test/data/contact
但是Acitivity中,以下這句Log出現次數是遞增的:
Log.d(LogConfig.CONTRACTS_TAG, "data change");第一次進頁面出現一次,第二次進頁面出現兩次,頁面也相應刷新兩次。
?
(4)后來發現是個低級錯誤,出界面時沒有取消監聽:
mContext.getContentResolver().unregisterContentObserver(mDataListener);
?
?
?
?
? 注冊/取消注冊ContentObserver方法,抽象類ContentResolver類中的方法原型如下:
?
????public final void?registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer)
???????????? 功能:為指定的Uri注冊一個ContentObserver派生類實例,當給定的Uri發生改變時,回調該實例對象去處理。
?????????? ??參數:uri????????? 需要觀察的Uri(需要在UriMatcher里注冊,否則該Uri也沒有意義了)
?observer????? ? ContentObserver的派生類實例
??????????????????? ????notifyForDescendents 為false 表示精確匹配,即只匹配該Uri
?????????????????????????????????????????????????????? ????????? ??? 為true 表示可以同時匹配其派生的Uri,舉例如下:
??????????????????? ????? 假設UriMatcher 里注冊的Uri共有以下類型:
??????????????????????????????? 1 、content://com.qin.cb/student (學生)
??????????????????????????????? 2 、content://com.qin.cb/student/#?
?????????????????????????????? ?3、?content://com.qin.cb/student/schoolchild(小學生,派生的Uri)
? ??假設我們當前需要觀察的Uri為content://com.qin.cb/student,如果發生數據變化的?Uri?為content://com.qin.cb/student/schoolchild
當notifyForDescendents為 false,那么該ContentObserver會監聽不到, ?
? ? ? ? ? ?當notifyForDescendents為 ture,能捕捉該Uri的數據庫變化。
?
? ? ? ? ? ? ? ? ? ? ?
轉載于:https://www.cnblogs.com/maxiaodoubao/p/4466167.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的数据库监听。数据库一次notify,Activity多次接收的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ashx误删后,未能创建类型
- 下一篇: Yii2.0 对数据库 查询的一些简单的