计时器 Timer(Kotlin Flow)

代码: 

class FlowTimer(
        private val duration: Int,
        private val scope: CoroutineScope,
        private val onTick: (Int) -> Unit,
        private val onStart: (() -> Unit)? = null,
        private val onFinish: (() -> Unit)? = null,
        private val interval: Int = 1
) {

    private val id = System.currentTimeMillis()   

    fun start(): Job {
        if (duration <= 0 || interval <= 0) {
            throw IllegalArgumentException("duration or interval cannot less than zero")
        }
        return flow {
            for (i in duration downTo 0) {
                emit(i)
                delay((interval * 1000).toLong())
            }
        }.onStart { onStart?.invoke() }
                .onCompletion {
                    if (it == null) {
                        onFinish?.invoke()
                    }
                }
                .onEach { onTick.invoke(it) }
                .flowOn(Dispatchers.Main)   // 确保上游回调,是在主线程回调
                .launchIn(scope)
    }

    override fun toString(): String = "Timer:(id=${id}"
}

用法: 

private var mTimer: Job? = null

override fun onCreate(savedInstanceState: Bundle?) {
        mTimer = FlowTimer(duration, lifecycleScope,
                onTick = { sec ->
                    Log.d("MainActivity", "sec:${sec}")
                }, 
                onFinish = { }
        ).start()
}

override fun onDestroy() {
        mTimer?.cancel
}

你可能感兴趣的:(kotlin,android,timer)