You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin场景下:请求失败(无网络)后点击对话框按钮重试请求

我来帮你搞定这个无网络重试的需求!咱们一步步改造你的checkPhone方法,加上网络错误拦截和重试逻辑:

1. 先封装网络错误判断与重试对话框工具

先写个实用的工具方法,用来快速判断是否是无网络错误,以及弹出重试对话框:

// 作为Context的扩展函数,方便在任意上下文调用
fun Context.showNetworkRetryDialog(onRetry: () -> Unit) {
    AlertDialog.Builder(this)
        .setTitle("网络异常")
        .setMessage("当前无网络连接,请检查网络后重试")
        .setPositiveButton("确认") { dialog, _ ->
            dialog.dismiss()
            onRetry() // 触发重试逻辑
        }
        .setNegativeButton("取消") { dialog, _ ->
            dialog.dismiss()
        }
        .setCancelable(false)
        .show()
}

// 判断Throwable是否为无网络相关错误
fun Throwable.isNetworkError(): Boolean {
    // 这里根据实际场景调整,比如Retrofit无网络时会抛出IOException子类
    return this is IOException || this.message?.contains("Failed to connect") == true
}
2. 改造checkPhone方法,加入错误处理与重试逻辑

把请求逻辑抽成单独函数,方便重试调用,同时完善错误分支的处理:

override fun checkPhone(phone: String, context: Context) {
    view?.showOrHideProgressBar(true)

    // 封装请求逻辑,便于重试调用
    fun executePhoneCheck() {
        apiManager.checkPhone(phone)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .subscribe({ result ->
                view?.showOrHideProgressBar(false)
                // 处理请求成功的结果,比如通知视图层更新UI
                view?.onPhoneCheckSuccess(result)
            }, { error ->
                view?.showOrHideProgressBar(false)
                when {
                    error.isNetworkError() -> {
                        // 无网络时弹出重试对话框,点击确认后重新发起请求
                        context.showNetworkRetryDialog {
                            checkPhone(phone, context)
                        }
                    }
                    else -> {
                        // 处理其他错误(如服务器错误、参数错误等)
                        view?.onPhoneCheckFailed(error.message ?: "请求失败,请稍后重试")
                    }
                }
            })
    }

    // 首次执行请求
    executePhoneCheck()
}
3. 关键细节说明
  • 请求逻辑封装:把RxJava的请求链抽成executePhoneCheck函数,避免重试时重复写冗余代码,让结构更清晰。
  • 进度条管理:不管请求成功还是失败,都记得隐藏进度条,防止界面一直处于加载状态。
  • 错误判断灵活性:isNetworkError方法可以根据你项目的实际错误类型调整(比如自定义的网络异常类)。
  • 对话框交互:设置setCancelable(false)是为了强制用户选择“确认”或“取消”,如果需要允许点击空白关闭对话框,改成true即可。

内容的提问来源于stack exchange,提问作者nicolas asinovich

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:37:32