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

RxJava如何在onErrorResumeNext中更新列表值且不中断其余校验流程

问题根源

当前代码中任意单个元素的validate()校验抛出异常时,会直接触发整个RxJava流的onError回调,导致后续元素的校验流程直接终止,同时你在map操作符中主动抛出异常的逻辑也会直接中断全局流程。

解决方案

核心思路是对单个元素的校验异常做独立捕获,不让错误向上传播到全局流,将每个元素的校验结果转为带状态的包装对象后再统一处理,具体修改如下:

1. 修改ViewModel中的validateList方法

// 注意统一类型,你原代码中参数写的List<Model>实际应该是List<TestModel>,按需调整即可
fun validateList(list: List<TestModel>): Single<List<TestModel>> {
    return Observable.fromIterable(list)
        .toFlowable(BackpressureStrategy.LATEST)
        // 每个元素单独处理校验和异常捕获
        .flatMapSingle { currentModel ->
            validate(currentModel) // 补充你原代码漏写的入参,校验当前遍历的元素
                .map<Result<String>> { Result.success(it.toString()) } // 成功结果包装
                .onErrorReturn { Result.failure(it) } // 失败结果包装,不会抛出到上层中断流
        }
        .toList()
        // 按索引对应原列表元素,更新对应字段
        .map { resultList ->
            list.mapIndexed { index, testModel ->
                val result = resultList[index]
                if (result.isSuccess) {
                    testModel.isVerified = result.getOrNull()
                } else {
                    // 校验失败时更新reason字段,保留异常信息
                    testModel.reason = result.exceptionOrNull()?.message ?: "未知校验错误"
                }
                testModel
            }
        }
        // 全局异常兜底,避免极端情况崩溃,按需返回原列表或者空列表
        .onErrorResumeNext { error -> 
            error.printStackTrace()
            Single.just(list) 
        }
}

2. Fragment调用逻辑无需改动

原有调用代码已经处理了成功和异常回调,修改后全局流不会因为单个元素校验失败触发onError,所有元素都会完成校验后统一返回更新后的列表。

注意点

  • 如果你的validate()方法本身没有入参,需要调整为能和当前遍历元素关联的逻辑,保证校验结果和元素一一对应
  • 如果不需要保留具体异常信息,也可以不用Result包装类,直接在校验失败时返回特定字符串标识,后续判断该标识来更新reason字段即可

内容的提问来源于stack exchange,提问作者Anshul Tyagi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 02:09:04