如何在 CountdownTimer 结束时通知 Observable
How to notify Observable when CountdownTimer is finished
我有一个自定义 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() 方法时发出值的可观察对象?我需要这个以便在主要 activity 上,我可以订阅该可观察对象并在倒数计时器到期时执行必要的操作。
您可以提供 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
。
我有一个自定义 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() 方法时发出值的可观察对象?我需要这个以便在主要 activity 上,我可以订阅该可观察对象并在倒数计时器到期时执行必要的操作。
您可以提供 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
。