今天项目中发现一个bug:

(1)当uri数据库中有更新,会从数据库层DataService中通知应用层,调用notifyChange:

mContext.getContentResolver().notifyChange(uri, null);

(2)Activity中有类DataListener

   class DataListener extends ContentObserver
{ public DataListener(Handler handler)
{
super(handler);
// TODO Auto-generated constructor stub
} @Override
public void onChange(boolean selfChange)
{
try
{
List<ContactDataItem> contactList = DataService.getInstance().getDao(ContactDataItem.class).queryForAll();
Log.d(LogConfig.CONTRACTS_TAG, "data change");
mNeedRefreshContactList = true;
mContactsAdapter.setContactList(contactList);
notifyDataSetChanged();
}
catch (SQLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

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的数据库变化。

数据库监听。数据库一次notify,Activity多次接收的更多相关文章

  1. MySQL监听数据库存储过程出现异常

    DELIMITER $$ DROP PROCEDURE IF EXISTS `proc_ordertourist_cancel`$$ CREATE PROCEDURE proc_ordertouris ...

  2. Oracle 数据库监听配置和服务

    -- 补充说明 如果要远程连接192.168.10.44上的oracle,那么192.168.10.44服务器必须启动TNSListener.(配置文件 listener.ora) PLSQL Dev ...

  3. Web重温系列(三):OracleDependency实现监听数据库变化

    有个小项目(后来由另一个小组以Java开发了),内容是监控一个Oracle数据库.如果其中一个表A有数据变动,则需要将相关内容重组后通过接口发送给B. 通常的解决办法是定时查询,时间间隔可以小一点,还 ...

  4. SqlDependency C#代码监听数据库表的变化

    SqlDependency提供了这样一种能力:当被监测的数据库中的数据发生变化时,SqlDependency会自动触发OnChange事件来通知应用程序,从而达到让系统自动更新数据(或缓存)的目的. ...

  5. Android简易实战教程--第二十一话《内容观察者监听数据库变化》

    当数据库的数据发生改变,我们又想知道具体改变的情况时,就需要对数据库的变化情况做一个监控.这个任务,就由内容观察者来完成.下面这个案例,为短信数据库注册内容观察者,来监控短信的变化情况,当短信数据库发 ...

  6. Oracle数据库监听服务无法启动

    (1) 安装好Oracle后,启动Net Manager,测试orcl失败,报错“ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务”,需要修改监听文件.修改前: # list ...

  7. Oracle 数据库监听无法连接上、监听HANG住、监听无响应、TNS-12560

    环境: Windows server 2003 Oracle 11.2.0.1 问题: 一套老数据库在运行了很久后,突然就连接不上了,提示监听异常. 处理: 1.CMD命令行检查监听状态:无监听 2. ...

  8. 问题1:Oracle数据库监听启动失败(重启监听,提示The listener supports no services)

    编辑监听文件:/home/DB/oracle/11gR2/db/network/admin/listener.ora 在文件内添加静态监听实例,如下内容: SID_LIST_LISTENER =(SI ...

  9. 无法重启oracle数据库监听

    一.报错 TNS-12541: TNS:no listener TNS-12560: TNS:protocol adapter error  TNS-00511: No listener   Linu ...

随机推荐

  1. .net core web发布到CentOS汇总

    直到今天我的博客终于可以见世人了,中间懒了很长一段时间,什么也没干,也没怎么学习,前段时间也是各种折腾,无心学习.本篇主要汇总下从一开始到现在遇到的问题汇总,作为学习笔记.我的博客就是我的学习笔记,因 ...

  2. hdu1542线段树+离散化+扫描线

    参考博客: http://blog.csdn.net/xingyeyongheng/article/details/8927732 总的来说就是用一条(假想的)线段去平行x轴从下往上扫描,扫描的过程中 ...

  3. substr 方法

    substr 方法 返回一个从指定位置开始,并具有指定长度的子字符串. 参数 start 必选.所需的子字符串的起始位置.字符串中第一个字符的索引为 0. length 可选项.返回的子字符串中包含的 ...

  4. _Meta 部分用法

    model.UserInfo._meta.app_label #获取该类所在app的app名称 model.UserInfo._meta.model_name #获取该类对应表名(字符串类型) mod ...

  5. tf.random_normal()函数

    tf.random_normal()函数用于从服从指定正太分布的数值中取出指定个数的值. tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf. ...

  6. Boost 读写锁

    //#########测试多线程,读写锁,递归锁 #include <boost/thread.hpp> #include <boost/thread/recursive_mutex ...

  7. windows下matplotlib的安装

    在上一篇中我想用matplotlib,无奈一直装不上,就在卸了又装装了又卸,反反复复之后,终于装好了. 初学python,首先就装了numpy,倒也没有多复杂,有需要的朋友可以直接http://sou ...

  8. 导入的Android项目出现红色感叹号

    [原因]  项目中存在导入包,在项目导入之后,classpath指向的包路径出现错误,即需要重新Bulidpath [解决方式]  右键项目名称 BuildPath —> Configure B ...

  9. CodeForces - 156C:Cipher (不错的DP)

    Sherlock Holmes found a mysterious correspondence of two VIPs and made up his mind to read it. But t ...

  10. 转载:【菜鸟玩Linux开发】通过MySQL自动同步刷新Redis

    转载: http://www.cnblogs.com/zhxilin/archive/2016/09/30/5923671.html