【发布时间】:2021-08-05 22:16:07
【问题描述】:
每当在 API 调用中发生 Internet 丢失或未知错误等一般错误时,我有一个用例需要显示带有重试按钮的错误 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()) 并按照代码 cmets 中的说明重试 API 调用。
协程方法迁移后的API接口:
interface TodoService {
@POST("todo/create")
suspend fun createTodo(@Body request: TodoRequest): TodoResponse
}
现在如何在没有 Call 对象的情况下实现相同的功能?
【问题讨论】:
标签: android kotlin retrofit2 kotlin-coroutines