Как уведомить Observable при завершении CountdownTimer

У меня есть пользовательский Android TextView, который показывает количество времени, оставшегося в игре, через CountDownTimer

class CountdownTextView(context: Context, attrs: AttributeSet) : TextView(context, attrs) { private lateinit var countDownTimer: CountDownTimer private lateinit var onFinishObservable: Observable<Unit> fun setTime(initTime: Int) { this.text = "$initTime:00" countDownTimer = object : CountDownTimer((initTime *1000).toLong(), 1000) { override fun onTick(millisUntilFinished: Long) { val minutes = millisUntilFinished / 60000 val seconds = (millisUntilFinished % 60000) / 1000 if (seconds / 10 > 0) { text = "$minutes:${(millisUntilFinished % 60000) / 1000}" } else { text = "$minutes:0${(millisUntilFinished % 60000) / 1000}" } } override fun onFinish() { } } fun startCountdown() { countDownTimer.start() } } 

Как настроить наблюдаемое значение, которое выдает значение при вызове метода countDownTimer onFinish ()? Мне нужно это для того, чтобы на основном мероприятии я мог подписаться на это наблюдаемое и выполнить необходимые действия, когда истечет время обратного отсчета.

Вы можете предоставить тему .

 val onFinishObservable = CompletableSubject.create() override fun onFinish() { onFinishObservable.onComplete() } 

Или вы можете использовать Rx для таймера вместо CountDownTimer .

 fun countDownTimer( time: Long, timeUnit: TimeUnit = TimeUnit.MILLISECONDS, tick: Long = 1, tickUnit: TimeUnit = TimeUnit.MILLISECONDS ): Observable<Long> { val timeNanos = timeUnit.toNanos(time).also { require(it >= 0) } val tickNanos = tickUnit.toNanos(tick).also { require(it > 0) } val ticks = timeNanos / tickNanos return Observable .intervalRange( 1L, ticks, timeNanos % tickNanos, tickNanos, TimeUnit.NANOSECONDS) .map { ticks - it } .startWith(ticks) } fun start(time: Long, timeUnit: TimeUnit = TimeUnit.SECONDS): Completable { timerSubscription?.dispose() val timer = countDownTimer(time, timeUnit, tickUnit = TimeUnit.SECONDS) timerSubscription = timer.subscribe { text = String.format("%d:%02d", it / 60, it % 60) } return timer.ignoreElements() } 

В любом случае вызывающий абонент может подписаться на этот Completable .

Intereting Posts
Android – ошибка преобразования Bytecode в Dex с версией min sdk Как сделать двойной сигнал с помощью ToneGenerator Желающий инициализировать объект в котлин? Использование неверного отчета Dagger2 @ Subcomponent.Builder kotlin: не может получить подтверждение аннотации api Подключение к топливу Модификаторы доступа Kotlin Может ли перегрузка операторов сравнения в Kotlin использоваться для реализации SQL-подобных функций? Как сделать событие прослушивания нажатия кнопки в Kotlin / JavaScript? Kotlin: For-loop должен иметь метод итератора – это ошибка? Как вы определяете команды компиляции, выпущенные IntelliJ Idea? Удаление из списка вызывает IndexOutOfBoundsException при повторении: Java-> Kotlin Спящий режим с Kotlin: @ManyToOne (fetch = FetchType.LAZY) Какова наилучшая практика для создания настраиваемого компонента пользовательского интерфейса в tornadofx? Создание публичного экземпляра частного внутреннего класса в Котлине