如何在出错时保持流程活跃/重新启动它?

问题描述 投票:0回答:1

在我的 Android ViewModel 中,我有这样的代码:

try {
    myRepository
        .getAllData()
        .catch {
            Timber.e("catch exception case 1")
            Timber.e(it)
        }
        .collect { data ->
            // use data to set UI state
            uiState = uiState.copy(data = data)
        }
} catch(e: Exception) {
    Timber.e("catch exception case 2")
    Timber.e(e)
    // how to keep the flow alive or restart it?
}
  1. 在测试期间我达到了

    catch exception case 2
    。在这种情况下,我想向用户显示错误,但让
    Flow
    保持活动状态(例如,如果用户按下重试按钮,然后可以通过
    Flow
    发送成功的数据)。但是根据我的理解,
    Flow
    由于异常而自动取消?如何重新启动
    Flow
    或防止它被取消?

  2. 在什么情况下会到达

    catch exception case 1

android android-viewmodel kotlin-flow android-architecture
1个回答
0
投票

您应该使用

retryWhen
而不是
catch
,它是
Flow
中处理异常的最强大的运算符。

它允许您:

  • 检查
    Throwable
  • 散发新价值
  • 重启原版
    Flow
    .

概念上你可以做这样的事情:

    myRepository
        .getAllData()
        .retryWhen { cause, attempt ->
            Timber.e("catch exception case 1")
            Timber.e(it)

            // Emit UiState downstream to show error
            emit(UiState.Error(cause))

            // Or predicate based on cause
            true
        }
        .collect { data ->
            // use data to set UI state
            uiState = uiState.copy(data = data)
        }

除非

uiState = uiState.copy(data = data)
可以抛出异常,我认为它不会。这段代码永远不会失败。

要使其失败,您应该将

false
返回到
retryWhen
或从
retryWhen
中重新抛出不同的异常。

© www.soinside.com 2019 - 2024. All rights reserved.