今天项目中发现一个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

数据库监听。数据库一次notify,Activity多次接收相关推荐

  1. oralce 数据库监听日志状态及目录:查看监听(使用grid用户登陆):

    数据库监听日志状态及目录:查看监听(使用grid用户登陆): su - grid 密码:grid [grid@db1 ~]$ lsnrctl LSNRCTL> status LSNRCTL> ...

  2. oracle数据库监听频道异常,数据库监听不定期出现异常故障处理

    故障现象: 数据库监听不定期出现异常,从应用tnsping数据库,时间花费很长甚至连不上 故障分析处理过程: 从应用主机tnsping如下: racdb1_scenemon$tnsping racdb ...

  3. oracle数据库监听问题,分享一个有意思的Oracle19c数据库监听异常

    概述 今天主要分享一个最近排查的监听问题,还是有点意思的,一起来看看吧~ 环境:oracle19c 单实例 用plsql连接提示,这里排除防火墙.账号密码问题,连接字符串按监听文件格式写 1. 测试监 ...

  4. oracle 监听报错,Oracle EBS系统数据库监听报错TNS-12547、TNS-12560和TNS-00517解决方法...

    记得有一次Oracle EBS系统中止运行3小时,实在比较一次惨痛的教训,让我至今记忆犹新. 问题症状:用户反映提交的请求全部是红色错误 开始意为是并发管理"标准管理器"的问题,在 ...

  5. oracle数据库监听说法正确,Oracle数据库错题合集

    1.在0racle中,数据定义语言用于 A:定义和修改数据结构 2.创建数据库表的多个列之间用逗号隔开,最后一个不用 3.在0rac1e中,下列有关概念的说法 a.网络服务名,是客户端程序访问需要配置 ...

  6. 3、配置/管理Oracle数据库---监听程序配置

    3.配置/管理Oracle数据库-监听程序配置 在成功创建Oracle数据库之后,用户可以对其进行配置和管理.需要用到网络配置助手工具 ​ 网络配置助手:主要用于Oracle数据库的监听程序.命名方法 ...

  7. 【做一下1】python 监听数据库变化

    前言 用的yolov5,作者自己写的loadStream函数就是依据 streams.txt里面的rtsp流地址列表来新建线程,然后实现多路监控的. 大体就是这个图里面说的,我已经是为了个整体业务,去 ...

  8. oracle 数据库起监听,oracle启动数据库监听

    linux/Aix启动.关闭Oracle及监听 Aix环境下管理Oracle 1.Aix下查看.启动数据库监听器 以oracle用户执行以下命令: ① lsnrctl status //-查看监听器状 ...

  9. java利用canal监听数据库

    springcloud如何使用canal监听mysql数据库操作 canal是阿里巴巴旗下的一款开源项目,纯Java开发.基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了MySQ ...

最新文章

  1. HttpWatch是强大的网页数据分析工具
  2. Android fingerprint指纹/face人脸代码导读
  3. UVA 146 ID Codes
  4. win8.1 php mysql,win8.1(64位) apache2.4.3+php5.6.3+mysql5.6安装
  5. mysql索引三个字段查询两个字段_mysql中关于关联索引的问题——对a,b,c三个字段建立联合索引,那么查询时使用其中的2个作为查询条件,是否还会走索引?...
  6. AAAI 2020 | GlobalTrack:简单又强大!视频长期目标跟踪新基线
  7. 做到这 3 点,斩获 BAT Offer 不是梦
  8. AI界的革命!终于可以自动标注了!
  9. leetcode319 Bulb Switcher
  10. 计算机网络:逆向工程(精细版)
  11. paddlex,2.1.0识别预测代码(包含视频的)
  12. Linux内核 触摸板,【教程】给Linux(elementary os)配置更多的触摸板手势
  13. Spring系列教程六: Spring jdbcTemplate在Dao中的使用
  14. 前端中文汉字转换为拼音、拼音首字母的插件Chinese-to-Pinyin
  15. 程序员如何选择适合自己的企业?
  16. Android之内存泄漏调试学习与总结
  17. List集合中的常见面试题以及简单思路
  18. Tensorflow2实现人脸关键点检测算法PFLD——一个精度高,速度快,模型小的人脸关键点检测模型
  19. Redis 个人狂神说视频学习笔记
  20. 体系的建模与仿真软件系统价格

热门文章

  1. 一款功能强大的IP查询工具
  2. 和 VMware、深信服、天翼云、招商云专家一起聊聊云原生边缘计算
  3. 免费下载来自阿里巴巴 双11 的《云原生大规模应用落地指南》
  4. 从零开始入门 K8s | Kubernetes 网络模型进阶
  5. 云原生应用万节点分钟级分发协同实践
  6. 全球首个开放应用模型 OAM 开源 | 云原生生态周报 Vol. 23
  7. Jmeter之函数助手操作
  8. python发送文件到钉钉群_iOS python 自动化打包,并在钉钉群里发通知
  9. mysql创建generator字段_springmvc+mybatsi-generator生成不了字段注释的解决方案
  10. java swt窗口,SWT Java:如何防止窗口调整大小?