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
相关产品推荐
相关产品推荐

