【问题标题】:Issue collecting a coroutine flow when applying a combine transformation on fragment created对创建的片段应用组合转换时收集协程流的问题
【发布时间】:2020-03-29 18:36:40
【问题描述】:

我在协程流程方面遇到了一个奇怪的问题。我有两个需要观察的流,如果其中一个发出一个值,则收集两个流并根据业务逻辑执行一些转换以发出一个结果,这是我有兴趣从片段中收集的结果。目前,我正在像这样在视图模型中进行此组合

//Done in viewmodel
val someComparisonValue = 2
val combinedFlow = firstFlow.combineTransform(secondFlow) { value1, value2 ->
    if (value1 != someComparisonValue) {
      emit(someValueComputed)
    }else if (value1 == value2){
      emit(AnotherValue)
    }
// if none of these conditions are met, emit the first value instead
     emit(value1)
}
// done in fragment
lifecycleScope.launchWhenCreated {
           view.combinedFlow.collect {
               Log.e("Logged", it.toString())
}

我的问题是,即使两个流在连接到广播通道时已经发出了值,但在创建片段时也不会收集它。然而,当片段已经创建并且另一个发射已经发送时,转换确实发生了。奇怪的部分是combineTransform 中没有条件逻辑,片段将始终在创建时获得值。似乎执行条件逻辑不是它在创建时执行的操作。有人知道如何解决这个问题吗?

【问题讨论】:

    标签: android android-fragments kotlin viewmodel kotlin-coroutines


    【解决方案1】:

    找到了解决方案,不知何故使用广播频道是问题的根本原因。由于某种原因,排放量可能会下降,因此不会触发流量。切换到 ConflatedBroadcastChannels 为我解决了这个问题

    【讨论】:

    • 为什么切换到混合广播频道有效?
    • @ArunL 因为我从多个视图模型和片段中收集,所以 ConflatedBroadcastChannel 对我有用,因为它将最新的发射发送给当前和未来的订阅者,在这种情况下,我遇到问题的片段是“未来”订阅者
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    • 2021-11-07
    • 2022-01-07
    • 2020-03-07
    • 1970-01-01
    • 2021-04-27
    • 2021-03-04
    相关资源
    最近更新 更多