在我的 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?
}
在测试期间我达到了
catch exception case 2
。在这种情况下,我想向用户显示错误,但让Flow
保持活动状态(例如,如果用户按下重试按钮,然后可以通过Flow
发送成功的数据)。但是根据我的理解,Flow
由于异常而自动取消?如何重新启动Flow
或防止它被取消?
在什么情况下会到达
catch exception case 1
?
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
中重新抛出不同的异常。