当前位置: 首页 > news >正文

ContentProvider 之 监听共享数据变化

在之前的开发中,我们在 TouristSpotContentProvider 函数 insert()delete()update()中调用了代码:

// java
getContext().getContentResolver().notifyChange(uri, null);

// kotlin
context!!.contentResolver.notifyChange(uri, null)

这是在共享数据发生改变的情况下,对外发出通知——该 Uri 对应的数据发生了变化;
业务中,我们可以通过注册监听该 Uri ,从而在共享数据发生改变的时候作出响应。

想要实现观察监听共享数据发生改变的功能,那就要实行如下步骤:

  1. 创建一个“观察者”类,继承自 ContentObserver,实现处理共享数据发生改变时的业务逻辑;
  2. 创建该“观察者”类的实例,并注册该“观察者”到对应共享数据 Uri

代码实践

我们要“观察监听”之前开发的“旅游景点”共享数据的改变,是在项目 ContentProviderSample代码基础上进行开发的。

1. 创建一个“观察者”类

MainActivity 中创建了一个“观察者”,它是一个内部类,继承了 ContentObserver
Java 代码

    private final class TouristSpotObserver extends ContentObserver {
        private static final String TAG = "TouristSpotObserver";

        public TouristSpotObserver(Handler handler) {
            super(handler);
        }

        @Override
        public void onChange(boolean selfChange) {// 当数据变化,回调该函数
            super.onChange(selfChange);
            Log.i(TAG, "data changed");
        }
    }

Kotlin 代码

    private class TouristSpotObserver(handler: Handler?) :
        ContentObserver(handler) {
        override fun onChange(selfChange: Boolean) { // 当数据变化,回调该函数
            super.onChange(selfChange)
            Log.i(TAG, "data changed")
        }

        companion object {
            private const val TAG = "TouristSpotObserver"
        }
    }

我们在函数 onChange() 中编写共享数据发生改变时的业务逻辑,这里简化处理打印日志。

2. 注册数据监听

MainActivity 的函数 onCreate() 中注册数据监听,
Java 代码

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        ......

        registerContentObserver();
    }

    /**
     * 注册数据监听器
     */
    private void registerContentObserver() {
        TouristSpotObserver observer = new TouristSpotObserver(new Handler());
        getContentResolver().registerContentObserver(TouristSpot.Spot.TOURISTS_CONTENT_URI, true, observer);
        getContentResolver().registerContentObserver(TouristSpot.Spot.SPOT_CONTENT_URI, true, observer);
    }

Kotlin 代码

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        ......

        registerContentObserver()
    }

    /**
     * 注册数据监听器
     */
    private fun registerContentObserver() {
        val observer = TouristSpotObserver(Handler())
        contentResolver.registerContentObserver(
            TouristSpot.Spot.TOURISTS_CONTENT_URI,
            true,
            observer
        )
        contentResolver.registerContentObserver(TouristSpot.Spot.SPOT_CONTENT_URI, true, observer)
    }

首先创建“观察者”类的实例,然后调用了 getContentResolver().registerContentObserver() 分别针对 Uri TouristSpot.Spot.TOURISTS_CONTENT_URITouristSpot.Spot.SPOT_CONTENT_URI 注册了数据监听。

3. 运行项目

运行项目,进入到 TouristSpotActivity 页面,输入“景点”信息,点击按钮插入数据;
界面刷新,数据插入成功了;然后查看日志台 Logcat:
onChange

显示出了我们在函数 onChange() 中写的日志——共享数据变化被监听到了。

项目代码地址

  • Java 版:
    https://github.com/BethelDEV/shaguaAndroid/tree/main/javaSource/ContentProviderSample

  • Kotlin 版:
    https://github.com/BethelDEV/shaguaAndroid/tree/main/kotlinSource/ContentProviderSample

相关文章:

  • 数字IC前端设计怎么学?薪资前景好吗?
  • IDEA+Java控制台实现房屋信息管理系统
  • 微服务项目:尚融宝(终)(核心业务流程:整合Rabbit MQ发送短信)
  • Python骚操作,实现驾考自动答题,这就直接满分了?
  • 【Gitee学习之路】Git概述安装教程基本操作指令
  • 一眼就看懂;Android App 开发前景介绍及学习路线规划
  • Python实现支持向量机SVM分类模型线性SVM决策过程的可视化项目实战
  • 想学习软件测试,求推荐看什么书或者教程?
  • Spring-事务管理
  • 监控平台SkyWalking9入门实践
  • 【Linux】常见指令(二)
  • 网络套接字实现UDP机制通信
  • C语言字符串函数的详解
  • 在 Next.js 中使用无服务器函数构建 API
  • Go语言json包怎么使用?
  • CentOS 7 防火墙操作
  • Docker下部署自己的LNMP工作环境
  • Git的一些常用操作
  • gops —— Go 程序诊断分析工具
  • iOS小技巧之UIImagePickerController实现头像选择
  • javascript 哈希表
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • ReactNative开发常用的三方模块
  • Theano - 导数
  • Unix命令
  • 浮动相关
  • 关于字符编码你应该知道的事情
  • 技术:超级实用的电脑小技巧
  • 理解在java “”i=i++;”所发生的事情
  • 面试遇到的一些题
  • 判断客户端类型,Android,iOS,PC
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 双管齐下,VMware的容器新战略
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (14)Hive调优——合并小文件
  • (4)Elastix图像配准:3D图像
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (动态规划)5. 最长回文子串 java解决
  • (二)斐波那契Fabonacci函数
  • (三)模仿学习-Action数据的模仿
  • (十一)手动添加用户和文件的特殊权限
  • (顺序)容器的好伴侣 --- 容器适配器
  • (一)插入排序
  • (转)拼包函数及网络封包的异常处理(含代码)
  • ****Linux下Mysql的安装和配置
  • ***详解账号泄露:全球约1亿用户已泄露
  • .NET CORE 第一节 创建基本的 asp.net core
  • .net MySql
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .Net小白的大学四年,内含面经
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示