【问题标题】:onCompletion not called while using Koltin Flow with LiveData将 Koltin Flow 与 LiveData 一起使用时未调用 onCompletion
【发布时间】:2020-05-09 20:24:36
【问题描述】:

这就是我试图用Flow 做的事情,我在onStart 中显示ProgressBar 并试图在onCompletion 中隐藏ProgressBar

在 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

【问题讨论】:

  • 不需要叫终端操作员来完成流程吗?还是在物品用完时会自动终止? “流上的终端操作符要么是暂停功能,例如 collect、single、reduce、toList 等,要么是在给定范围内开始收集流的 launchIn 操作符。”
  • 它会自动终止并将数据加载到 UI 中,但不应在 flow 完成时调用 onCompletion。我的目标是分别在onStartonCompletion 运算符中显示和隐藏ProgressBar
  • 我遇到了同样的问题,你是怎么解决的?
  • 我遇到了同样的问题,但意识到发射部分从未完成,因此从未调用过 onCompletion。检查您的流程是否完成
  • @Hussain 你是如何解决进度条问题的?我在同一条船上

标签: android kotlin android-livedata coroutine flow


【解决方案1】:

如果 appDatabase.eventDao().getAllEvents() 是基于 Flow 的 Room,则永远不会调用 onCompletion()

为什么?

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

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

【讨论】:

    猜你喜欢
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 2020-03-05
    • 2012-08-13
    • 2020-01-08
    • 2018-10-09
    相关资源
    最近更新 更多