如何在启用协程的改造界面中重试 API 调用

mah*_*gde 6 android kotlin retrofit2 kotlin-coroutines

我有一个用例,每当 API 调用中发生诸如互联网丢失或未知错误之类的一般错误时,需要显示带有重试按钮的错误 UI。当用户按下重试之前失败的 API 时,应该调用并恢复用户流程。

迁移协程方法前的API接口:

 interface TodoService {
    @POST("todo/create")
   fun createTodo(@Body request: TodoRequest): Call<TodoResponse>
}
Run Code Online (Sandbox Code Playgroud)

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

        }
    })
}
Run Code Online (Sandbox Code Playgroud)

在将改造接口迁移到协程挂起方法之前,这不是问题。因为我可以克隆改造调用对象(call.clone())并重试 API 调用,如代码注释中所述。

迁移协程方法后的API接口:

interface TodoService {
   @POST("todo/create")
   suspend fun createTodo(@Body request: TodoRequest): TodoResponse
}
Run Code Online (Sandbox Code Playgroud)

现在我如何在没有 Call 对象的情况下实现相同的功能?

小智 0

使用存储库和视图模型通过使用协程的实时数据获取响应,然后在您的活动中用户观察者获取日期,这是使用协程的最佳方法,也是 MVVM 的最佳实践

  • 我正在遵循存储库模式。看来你没明白我的问题。我不使用改造 Call&lt;T&gt; 因为如果您暂停则没有必要。现在你如何重试? (2认同)