【问题标题】:How to observe ContentProvider changes for coroutine flow如何观察协程流的 ContentProvider 变化
【发布时间】:2021-05-31 17:59:44
【问题描述】:

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

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

【问题讨论】:

    标签: android android-contentprovider coroutine flow


    【解决方案1】:

    你可以使用回调流

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      相关资源
      最近更新 更多