1. 使用Observable.interval
Observable.interval(0, 10, TimeUnit.SECONDS)
.compose(RxUtil.ioThreadToMainThread())
.subscribe(object : Observer<Long> {
override fun onComplete() {
}
override fun onSubscribe(d: Disposable) {
}
override fun onNext(t: Long) {
}
override fun onError(e: Throwable) {
}
})
2. CountDownTimer
timer = object : CountDownTimer(5000).toLong(), 1000) {
override fun onTick(millisUntilFinished: Long) {
}
override fun onFinish() {
}
}
timer?.start()
3. flow
fun countDownCoroutines(
total: Int,
scope: CoroutineScope,
onTick: (Int) -> Unit,
onStart: (() -> Unit)? = null,
onFinish: (() -> Unit)? = null,
): Job {
return flow {
for (i in total downTo 0) {
emit(i)
delay(1000)
}
}.flowOn(Dispatchers.Main)
.onStart { onStart?.invoke() }
.onCompletion { onFinish?.invoke() }
.onEach { onTick.invoke(it) }
.launchIn(scope)
}
使用
private var mCountdownJob: Job? = null
mBinding.btnStart.setOnClickListener {
mCountdownJob = countDownCoroutines(60, lifecycleScope,
onTick = { second ->
mBinding.text.text = "${second}s后重发"
}, onStart = {
// 倒计时开始
}, onFinish = {
// 倒计时结束,重置状态
mBinding.text.text = "发送验证码"
})
}
mBinding.btnStop.setOnClickListener {
// 取消倒计时
mCountdownJob?.cancel()