gpt4 book ai didi

android协程流手动重试

转载 作者:行者123 更新时间:2023-12-04 23:49:12 24 4
gpt4 key购买 nike

我在我的 viewModel 中使用 stateFlow 来获取带有密封类的 api 调用的结果,如下所示:

sealed class Resource<out T> {
data class Loading<T>(val data: T?): Resource<T>()
data class Success<T>(val data: T?): Resource<T>()
data class Error<T>(val error: Exception, val data: T?, val time: Long = System.currentTimeMillis()): Resource<Nothing>()
}
class VehicleViewModel @ViewModelInject constructor(application: Application, private val vehicleRepository: VehicleRepository): BaseViewModel(application) {

val vehiclesResource: StateFlow<Resource<List<Vehicle>>> = vehicleRepository.getVehicles().shareIn(viewModelScope, SharingStarted.Eagerly, replay = 1)
}
我想在我的 UI 中提出一个按钮,这样如果 api 调用失败,用户可以重试调用。我知道有一个 retry流上的方法,但不能手动调用,因为它仅在发生异常时触发。
一个常见的用例是:用户没有互联网连接,当 api 调用返回网络异常时,我向用户显示一条消息,告诉他检查其连接,然后使用重试按钮(或通过检测设备是现在已连接,无论如何),我重试流程。
但我想不出办法,就像你做不到的那样,比如调用 flow.retry() .实际 retry方法一旦发生异常就会被调用。我不想在不要求用户检查其连接的情况下立即重试,这是没有意义的。
实际上,我找到的唯一解决方案是在按下重试按钮时重新创建 Activity ,以便重置流程,但这当然对性能很糟糕。
没有流程,解决方案很简单,并且有大量示例,您只需要重新启动工作,但我无法找到正确使用流程的方法。我在本地房间数据库和远程服务之间的存储库中有逻辑,并且流 api 非常好,所以我也想将它用于这个用例。

最佳答案

我建议保留 vehicleResource作为 View 模型中的字段并调用函数以进行 API 调用以获取数据。

private val _vehiclesResource = MutableStateFlow<Resource<List<Vehicle>>>(Resource.Loading(emptyList()))
val vehiclesResource: StateFlow<Resource<List<Vehicle>>> = _vehiclesResource.asStateFlow()

init {
fetchVehicles()
}

private var vehicleJob : Job? = null

fun fetchVehicles() {
vehicleJob?.cancel()

vehicleJob = viewModelScope.launch {
vehicleRepository.getVehicles().collect {
_vehiclesResource.value = it
}
}
}
该 API 将在 viewmodel 的构造函数中调用。您还可以通过 View (按钮的单击监听器)调用此函数以获取错误状态。

P.S:我应该提到您的这行代码有问题,SharedFlow 无法转换为 StateFlow。
val vehiclesResource: StateFlow<Resource<List<Vehicle>>> = vehicleRepository.getVehicles().shareIn(viewModelScope, SharingStarted.Eagerly, replay = 1)

关于android协程流手动重试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66228893/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com