kotlin 如何观察协同程序流的ContentProvider变化

oo7oh9g9  于 2023-02-09  发布在  Kotlin
关注(0)|答案(1)|浏览(127)

我有一个通过内容提供程序从数据库中获取数据的流程。

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)
      }
    }
62lalag4

62lalag41#

您可以使用回调流

@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 -> 

}

相关问题