数据库监听。数据库一次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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值