0

我有一个自定义的 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() 方法时发出值的 observable?我需要这个,以便在主要活动中,我可以订阅该 observable 并在倒数计时器到期时执行必要的操作。

4

1 回答 1

0

您可以提供一个Subject

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.

于 2017-07-30T22:49:16.257 回答