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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值