Мне нравится, когда люди начинают использовать Rx. Это действительно совершенно другой образ мышления. Из-за этого вы можете создавать вещи, которые более функциональны, но иногда вы можете делать даже лучше. Похоже, вы напрямую преобразовали императивный код в функциональный. Такие вещи, как совместное использование изменяемого состояния между операторами, - не лучший вариант, потому что, если вы когда-нибудь начнете менять планировщик, на котором что-то работает, вы можете запустить вещи в заказах, которых вы не ожидали. Я думаю, вам действительно нужно что-то более функциональное. Обратите внимание, что я не включаю «наблюдаемые». каждый раз, потому что я хочу, чтобы пример был нагляднее.

private fun startAnimate() {
    compositeDisposable.add(
        concat(
            range(0, 7)
                .flatMap { just(it).delay(it * 100) },
            timer(300, TimeUnit.MILLISECONDS)
                .ignoreElements(),
            range(0,7)
                .flatMap { just(6 - it).delay(it * 100),
            timer(300, TimeUnit.MILLISECONDS)
                .ignoreElements(),
        )
        .repeat()
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe { showImage(it) }
    )
}

У меня там могут быть ошибки. Я не знаю. У меня не было возможности запустить это. Это было бы немного красивее без необходимости откладывать, но они - проблема. Я также не утверждаю, что это лучшее решение на свете. Придется с этим больше поиграть. В любом случае, это не требует, чтобы какое-либо состояние было передано какому-либо другому наблюдаемому или оператору. Я настоятельно рекомендую вам попытаться найти больше информации о чисто функциональном программировании. (Мне все еще нравится Haskell ☺️, но я странный.) В любом случае, получайте удовольствие от своих реактивных потоков!