Пауза / возобновление таймера / задержки в RX

Я пытаюсь приостановить / возобновить отложенную операцию с использованием rx-Java , и, на удивление, я не могу найти никаких подробностей о том, как это сделать.

Очевидно, я знаю, как это сделать, создавая конкретную нить Timer и отслеживая время, но я ищу более элегантный и реактивный способ.

У меня есть три разных наблюдаемых, playDetected , один для pauseDetected и один для stopDetected . Я хочу что-то испустить после некоторой задержки PLAY , но пауза, когда моя пауза, наблюдаемая, испускает и возобновляется, когда я получаю еще один PLAY

Что я до сих пор: (это написано в kotlin но Java , псевдокод или любой язык будет делать для ответа)

 val playSubscription = playDetected .delay(DELAY, SECONDS, schedulers.computation) .subscribe { emitFinalEvent(it) } stopDetected.subscribe { playSubscription.unsubscribe() } 

Моя задержка работает, и когда я обнаруживаю STOP , она успешно удаляет задержку, чтобы следующий PLAY мог снова запустить ее. Но как сделать паузу и возобновить, когда pauseDetected испускает что-то ???

Вот как я это сделал:

 playDetected .doOnNext { if (trackIsDifferent(it)) resetTimer() trackPlaying.set(it.track) } .switchMap { state -> interval(1, SECONDS, schedulers.computation) .doOnNext { currentTimer.incrementAndGet() } .takeUntil(merge(pauseDetected, stopDetected.doOnNext { resetTimer() })) .filter { currentTimer.get() == DELAY } .map { state } }.subscribe { emitFinalEvent(it)) } 

с:

 private val trackPlaying = AtomicReference<Track>() private val currentTimer = AtomicLong() private fun resetTimer() { currentTimer.set(0) } private fun trackIsDifferent(payload: StateWithTrack) = payload.track != trackPlaying.get() 

Некоторое время назад я также искал RX «таймеры», но не отвечал моим ожиданиям. Итак, вы можете найти свое решение:

 AtomicLong elapsedTime = new AtomicLong(); AtomicBoolean resumed = new AtomicBoolean(); AtomicBoolean stopped = new AtomicBoolean(); public Flowable<Long> startTimer() { //Create and starts timper resumed.set(true); stopped.set(false); return Flowable.interval(1, TimeUnit.SECONDS) .takeWhile(tick -> !stopped.get()) .filter(tick -> resumed.get()) .map(tick -> elapsedTime.addAndGet(1000)); } public void pauseTimer() { resumed.set(false); } public void resumeTimer() { resumed.set(true); } public void stopTimer() { stopped.set(true); } public void addToTimer(int seconds) { elapsedTime.addAndGet(seconds * 1000); } 

В случае задержки, просто функция interval перегрузки с задержкой.

Intereting Posts
Как добавить библиотеки в программу kotlin? Как интерпретировать и переводить код kotlin в java? Разница между типами и val для объекта перейти к объявлению в приложении create-react-kotlin-app не работает Как передать пользовательский объект через намерение в kotlin Как изменить свойство Kotlin 'this property с подсветкой' редактора кода в IntelliJ? Требует ли Kotlin рамки DI? Выражение лямбда не используется UnsupportedOperationException при построении проекта Kotlin в Idea Как заставить Джексона использовать параметры по умолчанию для Kotlin для отсутствующих значений? Функция Котлина: Требуемая единица измерения? Найдено Int Как вызвать функцию в kotlin с сырыми типами Как получить идентификатор ресурса в фрагменте, используя kotlin в android? Kotlin использует утверждения времени выполнения для проверки нуля – служебные накладные расходы? Как ссылаться на экземпляр внешнего класса в Котлине?