繁体   English   中英

如何观察协程流的 ContentProvider 变化

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM