Я занимаюсь разработкой приложения для 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()
})
Я хочу отменить, если первый запрос не удался.Как мне это сделать?
Вот возможный код.Но ... этот код ... я думаю, что это ужасно ... Есть какой-нибудь классный код, пожалуйста?
disposable.add(
restService.updateJob(token, job.id, options) // PUT
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ job ->
Log.d(TAG, "updateJob - success")
restService.runJob(token, job.id) // POST
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ job ->
Log.d(TAG, "runJob - success")
}, {
Log.e(TAG, "runJob - failed: ${it.message}")
it.printStackTrace()
})
}, {
Log.e(TAG, "updateJob - failed: ${it.message}")
it.printStackTrace()
})
)
У меня есть еще один вопрос.У меня есть список работ.И я хочу сделать то же самое.Даже если некоторые работы потерпят неудачу, я хочу продолжить на следующих работах.Я рассмотрел "onErrorResumeNext, onErrorReturn, doOnError".Но они не являются решением.Как я могу это сделать?
Observable.fromIterable(jobs)
.concatMap { job ->
val updateJob = restService.updateJob(token, job.id, options)
val printJob = restService.printJob(token, job.id)
updateJob.concatMap { printJob }
}
.window(1) // I thought "window" can be the solution. But it doesn't work.
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ job ->
Log.d(TAG, "runJobs - success")
}, {
Log.e(TAG, "runJobs - failed: ${it.message}")
it.printStackTrace()
})