Мне нравится, когда люди начинают использовать 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 ☺️, но я странный.) В любом случае, получайте удовольствие от своих реактивных потоков!