android - 将 Koltin Flow 与 LiveData 一起使用时未调用 onCompletion

标签 android kotlin android-livedata coroutine kotlin-flow

这就是我试图用 Flow 做的事情, 我正在展示 ProgressBaronStart并试图隐藏 ProgressBaronCompletion .

在 ViewModel 类中 appDatabase.eventDao().getAllEvents()返回 Flow<List<EntityEvents>

@ExperimentalCoroutinesApi
val allEvents: LiveData<Outcome<List<Event>>> = _fetchEvents.switchMap { _ ->
    appDatabase.eventDao().getAllEvents()
        .map { eventListMapper.map(it) }
        .map { sortEventsBasedOnPreference(it) }
        .flowOn(Dispatchers.IO)
        .map { Outcome.success(it) }
        .onStart { emitLoading(true) }
        .onCompletion { emitLoading(false) }
        .catch { emitFailure(it, R.string.err_something_wrong) }
        .asLiveData(context = viewModelScope.coroutineContext)
}

一切正常,我无法弄清楚为什么是 onCompletion任务完成时不调用?

最佳答案

如果 appDatabase.eventDao().getAllEvents() 基于 Room on Flow,则从不调用 onCompletion()

为什么?

因为 getAllXXX() 查询是“热门”。 实际上,查询并没有完成。仅发出数据。

当数据发生变化时,查询将再次发出数据。

关于android - 将 Koltin Flow 与 LiveData 一起使用时未调用 onCompletion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59880680/

相关文章:

java - Android Firebase 数据库路径无效

java - 为什么 GoogleCredentials.fromStream(myJson) 输出为 null?

android - 如何保持一个activity之前的状态

java - Realm Java 排序使 ChangeListener 变慢

android - 回收者 View 不会使用实时数据自动更新

java - 如何在 "query"方法中传递选择参数

android - ViewPager2没有显示

Java/Kotlin 等效于 Swift [字符串 : [String : Any]]

android - 我是否需要处理使用 LiveDataReactiveStreams 创建的发布者

android - 实时数据 : Candidate resolution will be changed soon