Как продолжить поток с ошибкой в ​​Rx? - PullRequest
0 голосов
/ 23 ноября 2018

Я разрабатываю приложение для Android с использованием Kotlin, RxJava, Retrofit.Я хочу отправить Http-запрос на сервер.

PUT - опция обновления задания

POST - запустить задание

enter image description here

После первого успешного запроса я отправляю второй.Поэтому я использовал 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()
    })

Но я не знаю в случае нескольких заданий, как показано ниже.

enter image description here

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 ().Как мне решить эту проблему?

1 Ответ

0 голосов
/ 30 ноября 2018

Я решил эту проблему, используя следующий код.

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()
    })
...