Android 倒计时一般实现方式:
- handler+postDelayed() 方式
- Timer + TimerTask + handler 方式
- ScheduledExecutorService + handler 方式
- RxJava 方式
- CountDownTimer 方式
现在因为有了协程和Flow,我们可以借助Flow这个工具,更加优雅地实现这个需求功能.
1.依赖导入
api 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2'
api 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1'
// lifecycleScope(可选)
api "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0"
2. 代码实现
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)
}
2.1使用:
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()
}
其他的完整Demo github.com/dahui888/ko…