我正在使用Kotlin,RxJava和Retrofit开发一个Android应用程序。 我想将Http请求发送到服务器。
PUT-作业的更新选项
POST-运行作业
第一个请求成功后,我发送第二个请求。所以我用了concatMap。
val updateJob = restService.updateJob(token, job.id, options) // PUT
val runJob = restService.runJob(token, job.id) // POST
updateJob.concatMap { runJob }
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ job ->
Log.d(TAG, "runJob - success: $job")
}, {
Log.e(TAG, "runJob - failed: ${it.message}")
it.printStackTrace()
})
但是我不知道是否有多个工作,如下所示。
我有工作清单。 如果一个作业的“更新”请求失败,则不应发送“运行”请求。 但是下一项工作应该继续。 为此,我编写如下代码。
Observable.fromIterable(jobs.toList())
.concatMap { job ->
val updateJob = restService.updateJob(token, job.id, job) // HTTP PUT Request
val runJob = restService.runJob(token, job.id) // HTTP POST Request
updateJob.concatMap { runJob }
}
.window(1)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
it.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
Log.e(TAG, "run job - success")
}, {
Log.e(TAG, "run job - failed - 1: ${it.message}")
it.printStackTrace()
})
}, {
Log.e(TAG, "run job - failed - 2: ${it.message}")
it.printStackTrace()
})
我认为“窗口”运算符可能是解决方案。 但这不是... 如果某些作业失败,则流将使用onError()结束。 我该如何解决这个问题?
答案 0 :(得分:0)
我使用以下代码解决了此问题。
Observable.fromIterable(jobs.toList())
.concatMap { job ->
val updateJob = restService.updateJob(token, job.id, job) // HTTP PUT Request
.onErrorResumeNext(Observable.empty<Job>()) // Solution Point
val runJob = restService.runJob(token, job.id) // HTTP POST Request
updateJob.concatMap { runJob }
}
// .window(2) I removed this line.
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
Log.d(TAG, "run job - success")
}, {
Log.e(TAG, "run job - failed - 2: ${it.message}")
it.printStackTrace()
})