Я разрабатываю приложение для Android с использованием Kotlin, RxJava, Retrofit.Я хочу отправить 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()
})
Но я не знаю в случае нескольких заданий, как показано ниже.
Iесть список работы.Если запрос на «обновление» одного задания не выполнен, запрос «выполнить» не должен отправляться.Но следующая работа должна продолжаться.Чтобы сделать это, я делаю код, подобный приведенному ниже.
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 ().Как мне решить эту проблему?