zoukankan      html  css  js  c++  java
  • 数据库监听。数据库一次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的数据库变化。

     

                         

  • 相关阅读:
    mysql--笔记1
    html-day04
    转换流 Properties集合 序列化 工具
    html--笔记day03
    map集合的应用
    关于IO流---笔记1
    关于什么是编码表的说明
    实现斗地主纸牌游戏---洗牌 发牌 看底牌的具体功能------Map集合存储方法 遍历的应用
    计算属性
    组件-配置组价
  • 原文地址:https://www.cnblogs.com/maxiaodoubao/p/4466167.html
Copyright © 2011-2022 走看看