Android 如何在启用协同路由的情况下在改型接口中重试API调用

Android 如何在启用协同路由的情况下在改型接口中重试API调用,android,kotlin,retrofit2,kotlin-coroutines,Android,Kotlin,Retrofit2,Kotlin Coroutines,我有一个用例,每当API调用中出现诸如internet丢失或未知错误之类的一般错误时,需要使用“重试”按钮显示错误UI。当用户按“重试”时,以前失败的API应调用并恢复用户流 迁移协同路由方法之前的API接口: interface TodoService { @POST("todo/create") fun createTodo(@Body request: TodoRequest): Call<TodoResponse> } interface

我有一个用例,每当API调用中出现诸如internet丢失或未知错误之类的一般错误时,需要使用“重试”按钮显示错误UI。当用户按“重试”时,以前失败的API应调用并恢复用户流

迁移协同路由方法之前的API接口:

 interface TodoService {
    @POST("todo/create")
   fun createTodo(@Body request: TodoRequest): Call<TodoResponse>
}
interface TodoService {
   @POST("todo/create")
   suspend fun createTodo(@Body request: TodoRequest): TodoResponse
}

现在,我如何在没有调用对象的情况下实现相同的功能?使用存储库和视图模型,通过使用协同程序通过实时数据获取响应,然后在活动中使用用户观察者获取日期这是使用协同程序的最佳方式,也是MVVM的最佳实践

您可以通过将操作保存到外部来处理重试协同程序工作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()
    }
}

我遵循存储库模式。看来你没明白我的问题。我不使用改装呼叫,因为如果您挂起,则不需要。现在如何重试?此解决方案非常有用。但我必须处理每个视图模型。所以这个解决方案是不可伸缩的。如果你只有几个请求,我会选择一个非通用的解决方案(follow KISS)。但您也可以创建自己的包装器,该包装器通过重试处理每个协同路由执行。
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()
    }
}