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

时间: 2024-08-30 10:03:25

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

Android使用ContentObserver监听数据库变化(转自:http://www.blogjava.net/zhaojianhua/archive/2011/10/27/362204.html)

android 使用contentobserver监听数据库内容变化 android 使用contentobserver监听数据库内容变化 在 android中经常会用到改变数据库内容后再去使用数据库更新的内容,很多人会重新去query一遍,但是这样的问题就是程序会特别占内存,而且有可能 会搂关cursor而导致程序内存未释放等等.其实android内部提供了一种ContentObserver的东西来监听数据库内容的变化.ContentObserver 的构造函数需要一个参数Hanlder,因为

关于Android中使用Uri监听数据库的变化

网上原创的关于监听数据库变化的文章很少,基本没找到有用的一篇,所以自己去看了一下蓝牙传输的源码,写了一个Demo,放在这里给大家参考一下,看源码: src里面有三个文件MyDataProvider.MainActivity和MyBean,看下面: MyDataProvider.java: public class MyDataProvider extends ContentProvider { // public static final String SCHEME = "test";

数据库监听

用oracle用户登录数据库后台执行:lsnrctl status  可查看数据库监听的启动状态. 1.若登录数据库时,出现如下错误提示:ORA-12541:TNS:无监听程序 1)监听配置有问题,需用oracle用户登录后台,修改文件$ORACLE_HOME/network/admin/tnsnames.ora与$ORACLE_HOME/network/admin/listener.ora 2)停止监听lsnrctl stop 3)启动监听lsnrctl start 日志记录在: /oracl

sql server 警报管理,实时监听数据库动向,运筹帷幄之中

原文:sql server 警报管理,实时监听数据库动向,运筹帷幄之中 工作这么多年了,无论是身边的同学还是同事,发现只要搞程序员的都有一个通病---懒.懒到谁都不愿意加班,尤其是"义务"加班.即使大家都不愿意加班,但是很多时候项目赶着上线或者上线之后出错啊什么的,总得有人看着,这时候就诞生了一种新的工作制度,叫做7*24.顾名思义就是这种岗位实时都得有人看着,这确实是一件让人头疼的事情.虽然说在项目刚上线不可避免的得有7*24,但是我们可以尽量减少7*24的工作量(ps:因为7*24

Oracle查看数据库与数据库监听启动状态

   1.数据库状态查询:    SQL>select status from v$instance;    2.数据库监听状态查询:    C:/Documents and Settings/skate_db>lsnrctl status    1.数据库状态命令结果详解:    [email protected]/export/home/oracle > sqlplus / as sysdba        SQL*Plus: Release 11.2.0.1.0 Productio

Oracle 数据库监听配置和服务

PLSQL Developer 非安装版  配置目录为文件目录 1是C:\Program Files\oracle\instantclient-basic-nt-11.2.0.4.0\instantclient_11_2 2是C:\Program Files\oracle\instantclient-basic-nt-11.2.0.4.0\instantclient_11_2\oci.dll 然后在环境变量中增加 变量名TNS_ADMIN  变量值C:\Program Files\oracle\

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

当数据库的数据发生改变,我们又想知道具体改变的情况时,就需要对数据库的变化情况做一个监控.这个任务,就由内容观察者来完成.下面这个案例,为短信数据库注册内容观察者,来监控短信的变化情况,当短信数据库发生改变的时候,去做相应的业务处理即可(这里只是打印log) 布局文件选择默认,因为用不到任何界面. 看一下主活动中的代码: package com.itydl.contentobserver; import android.net.Uri; import android.os.Bundle; imp

Android短信数据库监听回调多次问题

在监听Android短信数据库变化时.由于只能注册content://sms/ 的observer.所以,在数据库每次状态变化的时候,都会多次回调onChange 方式.目前还未找到很好的方式,解决回调多次的问题.只能通过代码逻辑来屏蔽这个问题. 目前,我使用的方式是通过时间来过滤两次的回调. long lastTimeofCall = 0L;    long lastTimeofUpdate = 0L;    long threshold_time = 10000; if (lastTimeo

修改oracle数据库监听端口号

oracle默认端口号是1521.很容易就被黑客扫描到然后天天惦记你的数据库 所以修改默认端口号就很有必要了 1.首先查看监听状态 lsnrctl status 2.关闭监听 lsnrctl stop 3.修改监听文件1521====>10001 SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (ORACLE_HOME = /u01/11g) (SID_NAME = pu) ) ) LISTENER = (DESCRIPTION_LIST = (DESCR