Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android RxJava:跳过fromIterable()中的所有错误,并在所有项发出时通知订阅者-Flowable.parallel execution_Android_Rx Java2_Flowable_Rx Java3 - Fatal编程技术网

Android RxJava:跳过fromIterable()中的所有错误,并在所有项发出时通知订阅者-Flowable.parallel execution

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调用,它根据“Id”验证某些状态。API返回单个或多个错误。我有一个这样的Id列表,只有一个Id可以返回成功或无(所有Id的返回错误)。我需要的是,遍历每个Id并跳过API调用中的错误,直到成功或列表结束。我能够按顺序实现这一点。然而,我正尝试使用并行流来实现同样的功能。 当一个Id返回成功时,它可以正常工作,但当没有返回成功的Id(所有Id都失败)时,它只是跳过API中的所有错误,但在所有Id都验证后不会通知订阅者。我不知道该怎么处理

// 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成功