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

2024-03-25

我有一个用例,每当 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(使用前将#替换为@)

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

随机推荐

  • Internet Explorer 和 jQuery 的“权限被拒绝”

    我尝试使用 jQuery 进行 AJAX 调用 post在 Internet Explorer 中 但我得到的只是一条错误消息 权限被拒绝 这个问题有点奇怪 因为只有当我在访问任何其他页面之后访问一个页面时才会出现这种情况 例如 我在地址行
  • 无法使用 firebase 函数获取 req.path 和 req.query.abc

    我正在尝试获取请求查询参数和网址firebase functions 这是我正在使用的代码 firebase json hosting public build rewrites source getCoins function getCo
  • Java - 如何测试 Catch 块?

    有点转发 但是关于没有足够声誉的第 22 条军规意味着我无法对任何重复的线程发表评论 咳嗽 我正在尝试使用 Mockito 测试 try catch 的 catch 块 是否可以使模拟抛出由正在测试的方法处理的异常 我无法使用 doThro
  • 为什么 return 不遵守finally 块中变量的值?

    finally总是最后执行 所以语句x 3应该最后执行 但是 运行此代码时 返回的值为 2 Why class Test public static void main String args System out println fina
  • 使用 AVPlayer 进行串流速度很慢

    我使用 AVPlayer 从互联网上传输 mp3 文件 但它的运行速度非常慢 使用探查器 我发现它首先下载整个文件 然后开始播放 有什么解决方法吗 现在 我正在使用这段代码 if let player player Notification
  • 使用预先签名的 URL 将文件放入 S3

    我整夜都在使用 Amazon S3 预签名 URL 来尝试 PUT 文件 我在 java 代码中生成预签名 URL AWSCredentials credentials new BasicAWSCredentials accessKey s
  • iPhone : 自定义标签栏,没有可怕的“更多”菜单

    所以我想构建一个具有超过 5 个项目并且可滚动的选项卡栏并找到本文 http www rumex it 2010 11 how to customise the tab bar uitabbar in an iphone applicati
  • “OpenCV”被视为未找到

    Linux 风格 Debian Crunch Bang 出现问题 尝试使用以下命令构建 cvblob 时 cd cvblob cmake Error CMake Error at cvBlob CMakeLists txt 20 find
  • NuGet 如何将属性应用于文件

    我正在创建 NuGet 包 我已经放入了两个文件content用户安装此软件包时将添加的文件夹 exe 和配置文件 另外我想更改这两个文件的 VS 项目属性 构建包时我需要做什么 当您说 应用属性更改 时 您是指文件系统属性 例如上次修改时
  • 通过 Xcode 发布时:下载的软件组件已损坏且无法使用

    在尝试通过 Xcode 发布 iOS 应用程序并通过大部分验证后 我收到以下错误 下载的软件组件已损坏且无法使用 https contentdelivery itunes apple com transporter repositories
  • 如何使用 Fabric.js 在画布上画一条线

    我正在使用 Fabric js 在画布上画一条线 这是我的代码 但我没有得到任何输出 Line click function alert Line canvas add new fabric Line 50 100 200 200 left
  • 使用 php 创建像 Twitter 或 Convore 这样的提及

    你好 我只是好奇 关于他们如何做事 我认为他们会做这样的事情 someone1 im stacking on stackoverflow RT someone2 hello guys what are you doing 在我以我的方式做之
  • 静态库 API 问题(std::string 与 char*)

    我以前没有使用过静态库 但现在我需要 设想 我正在 Unix 中编写一个控制台应用程序 我自由使用std string无处不在 因为这样做很容易 然而 我最近发现我必须在 Windows 中支持它 并且第三方应用程序需要 API 来连接我的
  • 使用 iText 检测动态 XFA

    我需要将预先填充的 PDF XFA 表单设置为只读 因为没有输入 例如文本 复选框 单选按钮等可以更改其值 对于常规 AcroForms PDF 和静态 XFA 表单 我可以通过调用来完成此操作setFormFlattening true
  • 为什么python的subprocess.call是这样实现的?

    subprocess模块 具有便捷的功能call 在2 6和3 1中都是这样实现的 def call popenargs kwargs return Popen popenargs kwargs wait 该函数的文档带有红色警告 内容如下
  • 多用户应用程序无需安装任何东西 - 允许并发用户写入的嵌入式数据库? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我需要创建一个应用程序 被多个用户同时使用 不需要any安装 有一个集中的数据存储 数据必须被存储inside公司网络 i 无权访问到公司内部数
  • 更新 UpdatePanel 内的标签

    我在更新面板中有一个标签和按钮 当我尝试从按钮单击上的标签获取值时 我从标签获取值 但是当我尝试将值设置为标签时 它不会发生 我检查了 JavaScript 错误 但没有任何错误 有人猜测可能是什么原因吗 我正在使用 dotnetnuke
  • 程序“[4432] iisexpress.exe”已退出,代码为-2147023895 (0x800703e9)

    我在使用 IIS Express 时遇到了非常令人沮丧的问题 当我开始调试时一切正常 但在几次请求后 IIS 挂起并崩溃 我的浏览器 Chrome 版本 37 0 2062 120 m 等待响应几秒钟 然后 IIS Express 停止运行
  • 在 webview android 中启用复制和粘贴

    是否可以从网络视图中选择文本然后进行复制和粘贴 有什么特殊的方法可以做到这一点吗 请帮助我 希望对你有帮助 public void selectAndCopyText try Method m WebView class getMethod
  • 如何在启用协程的改造界面中重试 API 调用

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