我有一个用例,每当 API 调用中发生诸如互联网丢失或未知错误之类的一般错误时,需要显示带有重试按钮的错误 UI。当用户按下重试之前失败的 API 时,应该调用并恢复用户流程。
迁移协程方法前的API接口:
interface TodoService {
@POST("todo/create")
fun createTodo(@Body request: TodoRequest): Call<TodoResponse>
}
API客户端:
fun <T> fetch(call: Call<T>, completion: (result: NetworkBoundResource<T>) -> Unit) {
call.enqueue(object : Callback<T> {
override fun onFailure(call: Call<T>, t: Throwable) {
// I have the mechanism save call object and completion and show error UI
// when user press retry fetch(call.clone(), completion
}
override fun onResponse(call: Call<T>, response: Response<T>) {
}
})
}
在将改造接口迁移到协程挂起方法之前,这不是问题。因为我可以克隆改造调用对象(call.clone())
并按照代码注释中的说明重试 API 调用。
迁移协程方法后的API接口:
interface TodoService {
@POST("todo/create")
suspend fun createTodo(@Body request: TodoRequest): TodoResponse
}
现在我如何在没有 Call 对象的情况下实现相同的功能?
您可以通过在协程作业 e 之外保存操作来处理重试。 G。在按钮上添加调度。
这是简单的示例,但尚未完成:
class ViewModel {
val context = CoroutineScope(Dispatchers.Main)
var dispatchRetry: (() -> Unit)? = null
fun createTodo(requestData: TodoRequest) {
context.launch() {
try {
todoService.createTodo(requestData)
} catch (t: Throwable) {
dispatchRetry = { todoService.createTodo(requestData) }
}
}
}
fun retry() {
dispatchRetry?.invoke()
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)