Android RxJava:跳过fromIterable()中的所有错误,并在所有项发出时通知订阅者-Flowable.parallel execution
我有一个API调用,它根据“Id”验证某些状态。API返回单个或多个错误。我有一个这样的Id列表,只有一个Id可以返回成功或无(所有Id的返回错误)。我需要的是,遍历每个Id并跳过API调用中的错误,直到成功或列表结束。我能够按顺序实现这一点。然而,我正尝试使用并行流来实现同样的功能。 当一个Id返回成功时,它可以正常工作,但当没有返回成功的Id(所有Id都失败)时,它只是跳过API中的所有错误,但在所有Id都验证后不会通知订阅者。我不知道该怎么处理Android RxJava:跳过fromIterable()中的所有错误,并在所有项发出时通知订阅者-Flowable.parallel execution,android,rx-java2,flowable,rx-java3,Android,Rx Java2,Flowable,Rx Java3,我有一个API调用,它根据“Id”验证某些状态。API返回单个或多个错误。我有一个这样的Id列表,只有一个Id可以返回成功或无(所有Id的返回错误)。我需要的是,遍历每个Id并跳过API调用中的错误,直到成功或列表结束。我能够按顺序实现这一点。然而,我正尝试使用并行流来实现同样的功能。 当一个Id返回成功时,它可以正常工作,但当没有返回成功的Id(所有Id都失败)时,它只是跳过API中的所有错误,但在所有Id都验证后不会通知订阅者。我不知道该怎么处理 // API call fun getSta
// API call
fun getStatus(Id: String): Single<String> {
//... returns Single<String> or error
}
//Sequential flow, Working
fun getStatus(ids: List<String>): Single<String> {
Observable.fromIterable(ids)
.flatMapSingle { id ->
getStatus(id)
.onErrorResumeWith { singleSource ->
if (ids.last() == id)) { //If this is last item in list, return error
singleSource.onError(NoStatusFoundException())
} else {
// Skip errors until valid id is found or till the list reached end.
Flowable.empty<String>()
}
}
}.firstOrError()
}
// Parallel Flow, How to identify the list is completed and return NoStatusFoundException in case of all id's fail?
fun getStatus(ids: List<String>): Single<String> {
Flowable.fromIterable(ids)
.parallel()
.runOn(io())
.flatMap{ id -> getStatus(id).toFlowable()
.onErrorResumeWith { Flowable.empty<String>() }
}
.sequentialDelayError()
.firstOrError()
.onErrorResumeNext { Single.error(it) }
}
// Subscription
getStatus(listOf("1","2","3","4","5",))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscriber({ id->
// success
this is notified when an id is success
},
{ // error handler - Need help here
Never notified when all the id's fail?
})
//API调用
fun getStatus(Id:String):单个{
//…返回单个或多个错误
}
//顺序流动
乐趣状态(ID:列表):单个{
可观察的。从可观察的(ids)
.flatMapSingle{id->
获取状态(id)
.onErrorResumeWith{singleSource->
如果(ids.last()==id)){//如果这是列表中的最后一项,则返回错误
singleSource.OneError(NoStatusFoundException())
}否则{
//跳过错误,直到找到有效id或列表结束。
Flowable.empty()
}
}
}.firstOrError()
}
//并行流,当所有id都失败时,如何识别列表已完成并返回NoStatusFoundException?
fun getStatus(id:List):单个{
可流动。可流动(ID)
.parallel()
.runOn(io())
.flatMap{id->getStatus(id).toFlowable()
.onErrorResumeWith{Flowable.empty()}
}
.sequentialDelayError()
.firstOrError()
.onErrorResumeNext{Single.error(it)}
}
//订阅
getStatus(列表中的(“1”、“2”、“3”、“4”、“5”))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscriber({id->
//成功
当id成功时,会通知此消息
},
{//错误处理程序-需要帮助吗
当所有id都失败时从未通知?
})
您将返回Flowable.empty(),它将立即完成订阅。摘自文件:
返回一个不向{@link Subscriber}发出任何项的可流动项,并立即调用其{@link Subscriber#onComplete onComplete}方法
也许您可以返回Flowable.just(“”
),或者在出现错误时提供一些预期参数
.onErrorResumeWith { Flowable.just("") }
您将返回Flowable.empty(),它将立即完成订阅。摘自文件: 返回一个不向{@link Subscriber}发出任何项的可流动项,并立即调用其{@link Subscriber#onComplete onComplete}方法 也许您可以返回
Flowable.just(“”
),或者在出现错误时提供一些预期参数
.onErrorResumeWith { Flowable.just("") }
问题出在这一行:
.onErrorResumeWith { Flowable.empty<String>() }
问题出在这一行:
.onErrorResumeWith { Flowable.empty<String>() }
我可以通过在flatMap中删除带有{Flowable.empty()}的
onerrorResume,并实现RxJavaPlugins.setErrorHandler{…}
来解决这个问题。
sequentialDelayError()
延迟所有错误,直到所有rails完成其任务
fun getStatus(ids: List<String>): Single<String> {
Flowable.fromIterable(ids)
.parallel()
.runOn(io())
.flatMap{ id -> getStatus(id).toFlowable()
}
.sequentialDelayError()
.firstOrError()
.onErrorResumeNext { Single.error(it) }
}
///
RxJavaPlugins.setErrorHandler{ it: Throwable ->
is UndeliverableException -> {...}
.....
}
fun getStatus(id:List):单个{
可流动。可流动(ID)
.parallel()
.runOn(io())
.flatMap{id->getStatus(id).toFlowable()
}
.sequentialDelayError()
.firstOrError()
.onErrorResumeNext{Single.error(it)}
}
///
RxJavaPlugins.setErrorHandler{it:Throwable->
是无法送达的异常->{…}
.....
}
我可以通过在flatMap中删除带有{Flowable.empty()}
的onerrorResume,并实现RxJavaPlugins.setErrorHandler{…}
来解决这个问题。
sequentialDelayError()
延迟所有错误,直到所有rails完成其任务
fun getStatus(ids: List<String>): Single<String> {
Flowable.fromIterable(ids)
.parallel()
.runOn(io())
.flatMap{ id -> getStatus(id).toFlowable()
}
.sequentialDelayError()
.firstOrError()
.onErrorResumeNext { Single.error(it) }
}
///
RxJavaPlugins.setErrorHandler{ it: Throwable ->
is UndeliverableException -> {...}
.....
}
fun getStatus(id:List):单个{
可流动。可流动(ID)
.parallel()
.runOn(io())
.flatMap{id->getStatus(id).toFlowable()
}
.sequentialDelayError()
.firstOrError()
.onErrorResumeNext{Single.error(it)}
}
///
RxJavaPlugins.setErrorHandler{it:Throwable->
是无法送达的异常->{…}
.....
}
我故意将Flowable.empty()
放在flatMap内部的错误上,因为我想跳过getStatus(id)
调用引发的错误,并从迭代中继续项目。我想知道fromIterable()何时完成所有项目的发送,以便通知订阅者所有id都失败。您阅读了我的帖子吗?“不向订阅服务器发送任何项,并立即调用其onComplete方法。”我知道,发送其他值将使我在出现错误时发送的值成功。这不是我所期望的。实际上,只需使用Flowable.empty()
忽略该错误,并使用列表中的其他id继续调用getStatus(id)
。为了更好地理解,我编辑了与订阅服务器的问题。我故意将Flowable.empty()
放在flatMap中的错误上,因为我想跳过getStatus(id)
调用引发的错误,并从迭代中继续项目。我想知道fromIterable()何时完成所有项目的发送,以便通知订阅者所有id都失败。您阅读了我的帖子吗?“不向订阅服务器发送任何项,并立即调用其onComplete方法。”我知道,发送其他值将使val成功