gpt4 book ai didi

android - 如何在启用协程的改造接口(interface)中重试 API 调用

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

每当在 API 调用中发生诸如 Internet 丢失或未知错误等一般错误需要显示带有重试按钮的错误 UI 时,我都有一个用例。当用户按下重试之前失败的 API 应该调用并恢复用户流程。
迁移协程方法前的API接口(interface):

 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>) {

}
})
}
在将改造接口(interface)迁移到协程挂起方法之前,这不是问题。因为我可以克隆改造调用对象 (call.clone())并按照代码注释中的说明重试 API 调用。
迁移协程方法后的API接口(interface):
interface TodoService {
@POST("todo/create")
suspend fun createTodo(@Body request: TodoRequest): TodoResponse
}
现在如何在没有 Call 对象的情况下实现相同的功能?

最佳答案

您可以通过将操作保存在协程作业之外来处理重试。 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()
}
}

关于android - 如何在启用协程的改造接口(interface)中重试 API 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67556345/

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