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

