Android定时执行——倒计时

303 阅读1分钟

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()

参考: Android 使用flow实现倒计时的方式

# Android 倒计时的五种实现方式