[英]How to observe ContentProvider changes for coroutine flow
我有一个通过内容提供者从数据库中获取数据的流程。
fun getDataFlow(): Flow<Result> {
return flow {
emit(Result.Loading)
// fetchAll() is the method to fetch data via contentResolover.query()
val results = fetchAll()
emit(Result.Success(categories))
}.catch { e ->
emit(Result.Error(e))
}
}
那么如何在 ContentProvider 数据发生变化时触发重新获取数据(onChange 被调用)?
val contentObserver = object : ContentObserver(null) {
override fun onChange(selfChange: Boolean) {
super.onChange(selfChange)
}
}
你可以使用回调流
@ExperimentalCoroutinesApi
fun ContentResolver.register(uri: Uri) = callbackFlow<Boolean> {
val observer = object : ContentObserver(null) {
override fun onChange(selfChange: Boolean) {
trySend(selfChange)
}
}
registerContentObserver(uri, false, observer)
invokeOnClose {
unregisterContentObserver(observer)
}
}
然后你可以做这样的事情
getDataFlow().combine(ContentResolver.register("YOUR_URI")){data, isSelfChange ->
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.