kotlin——倒计时(CountDownTimer和flow形式)

一、kotlin倒计时-谷歌CountDownTimer

简介:谷歌官方推荐使用CountDownTimer,非常的简单好用,代码也很少

代码

var TotalTime : Long = 2*60*60*1000 //总时长 2小时
    var countDownTimer=object : CountDownTimer(TotalTime,1000){//1000ms运行一次onTick里面的方法
        override fun onFinish() {
            Log.d(TAG,"==倒计时结束")
        }

        override fun onTick(millisUntilFinished: Long) {
            var hour=millisUntilFinished/1000/60/60
            var minute=millisUntilFinished/1000/60%60
            var second=millisUntilFinished/1000%60
            Log.d(TAG,"==倒计时"+hour+"小时"+minute+"分"+second+"秒")
        }
    }.start()

使用说明

1、把这段代码放到类的属性里就可以自动运行了
2、把上面代码中的.start()去掉,然后在需要用到的地方countDownTimer.start()就可以运行了

二、kotlin倒计时-谷歌CountDownTimer

引入协程:implementation ‘androidx.lifecycle:lifecycle-runtime-ktx:2.2.0’ // 协程lifecycleScope
倒计时代码(扩展方法):

import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.CoroutineScope

import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.*

import kotlinx.coroutines.flow.onCompletion
import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.launch

/**
 * 扩展方法
 * 倒计时的实现
 */
fun AppCompatActivity.countDown(
    time: Int = 30,
    start: (scop: CoroutineScope) -> Unit,
    next: (time: String) -> Unit,
    end: () -> Unit
) {
    lifecycleScope.launch {
        // 在这个范围内启动的协程会在Lifecycle被销毁的时候自动取消
        flow {
            (time downTo 0).forEach {
                delay(1000)
                emit(it)
            }
        }.onStart {
            // 倒计时开始 ,在这里可以让Button 禁止点击状态
            start(this@launch)
        }.onCompletion {
            // 倒计时结束 ,在这里可以让Button 恢复点击状态
            end()
        }.catch {
            //错误
            Log.e("", it.message ?: "Unkown Error")
        }.collect {
            // 在这里 更新值来显示到UI
            next(it.toString())
        }
    }
}

你可能感兴趣的:(kotlin,-,java,kotlin,android,开发语言)