【问题标题】:Handle error while filtering list of objects in RxJava在 RxJava 中过滤对象列表时处理错误
【发布时间】:2021-10-13 10:18:23
【问题描述】:

您好,我在 ViewModel 类中分别从列表中发出每个项目,以对返回布尔值的每个项目的字符串执行一些验证,然后我更新每个项目中的布尔值并返回列表。但我无法更新 List 中的另一个参数,原因将是Throwable.stacktrace()

在 ViewModel 中

 fun validateList(list: List<TestModel>): Single<List<TestModel>> {
    return Observable.fromIterable(list)
        .toFlowable(BackpressureStrategy.LATEST)
        .map { it.jsonString }
        .map { it?.let { VerifiableObject(it) } ?: throw IllegalStateException("Json must not be null") }
        .flatMapSingle { validate() }
        .toList()
        .map {
            list.mapIndexed { index, testModel ->
                (if (it[index] != null) {
                     //Updating boolean value here
                    testModel.isVerified = it[index].toString()
                } else throw Exception("ERROR")); testModel
            }
        }
}

在片段中

viewModel. validateList(arrayList)
        .doFinally {
            showLoading(false)
        }
        .asyncToUiSingle()
        .subscribe({

            //Updating UI
            adjustCard(it)
        }, {
            it.printStackTrace()
        })
        .addTo(disposables)

测试模型

 data class TestModel(
val title: String,
var isVerified: String? = null,
var reason: String? = null)

一旦任何项目获得假值,我需要在reason 字段中插入值,但有异常。如果您对此有任何想法,请帮助我。

【问题讨论】:

  • 不抛出该错误,而是在else 子句中为TestModel.reason 分配一些值怎么样?
  • 但在其他情况下不会出现错误。出错时直接调用订阅it.printstacktrace。
  • 错误的堆栈跟踪是什么?
  • 任何 API 调用错误。它不会陷入 else 子句中。这就是原因。我想要在 else 子句中,这样我就可以在 arraylist 的正确索引处更新具有动态错误的天线。
  • validate 失败了吗?如果是这样,如何验证不依赖于当前项目?

标签: android rx-java


【解决方案1】:

如果validate给你带来麻烦,应用onErrorResumeNext并将子序列变回原来的TestModel项:

fun validateList(list: List<TestModel>): Single<List<TestModel>> {
    return Observable.fromIterable(list)
           .flatMapSingle { value ->
                validate(VerifiableObject(value.jsonString))
                .map { 
                     value.isVerified = it.toString
                     value 
                }
                .onErrorResumeNext {
                     value.reason = it.toString
                     Single.just(value)
                }
           }
           .toList()
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    相关资源
    最近更新 更多