Kotlin flow 实现计时器工具类

class FlowCountDownTimer constructor(private var time: Int) {
    constructor(
        time: Int,
        callBack: (time: Int) -> Unit,
        onFinish: (time: Int) -> Unit
    ) : this(time) {
        mTime = time
        mCallBack = callBack
        mOnFinish = onFinish
    }
    //总时间
    private var mTime: Int = time
    //已走事件
    private var tTime = 0
    private var mCallBack: (time: Int) -> Unit? = {}
    private var mOnFinish: (time: Int) -> Unit? = {}

    private var finish = true//计时器是否已结束
    private var clean = true //计时状态 是否为清除

    private val intFlow = flow {
        finish = false
        while (!clean && tTime < mTime) {//当前为计时状态,且时间未执行完毕
            tTime++
            emit(mTime - tTime)//发送事件到下一步
            delay(1000)
        }
    }.flowOn(Dispatchers.Main)//定义处理事件的线程
        .onEach { mCallBack.invoke(it) }//接收事件
        .onCompletion { cause -> //结束事件判断
            if (cause == null) {
                clean = true
                finish = true
                mOnFinish.invoke(0)
            }
        }




    /**
     * 开始倒计时
     * @param time 倒计时时长
     * @param callBack 倒计时反馈
     * @param onFinish 结束事件
     */
    //开始计时,判断当前是否存在计时未走完,存在则更新,不存在则启动
    fun start(
        time: Int = this.time,
        callBack: (time: Int) -> Unit,
        onFinish: (time: Int) -> Unit
    ) {
        clean = false
        tTime = 0
        mTime = time
        mCallBack = callBack
        mOnFinish = onFinish
        if (finish) {
            //开始发送事件,设置执行线程
            intFlow.launchIn(CoroutineScope(Dispatchers.Main)) 

        }
    }

    //开始计时,判断当前是否存在计时未走完,存在则更新,不存在则启动
    fun start() {
        clean = false
        tTime = 0
        if (finish) {
            mTime = time
            intFlow.launchIn(CoroutineScope(Dispatchers.Main)) //保证在一个协程中执行
        }
    }

    /**
     * 清除倒计时
     */
    fun cancel() {
        tTime = 0   //清除已走时间
        clean = true//停止时间标识设为停止
    }
}

### 回答1: Kotlin Flow 是一种基于协程的数据流库,可以用于异步数据处理。要实现延迟代码,可以使用 Flow 的 delay 操作符。 例如,以下代码演示了如何使用 Kotlin Flow 实现延迟代码: ```kotlin import kotlinx.coroutines.delay import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.collect import kotlinx.coroutines.runBlocking fun main() = runBlocking { flow { emit(1) delay(1000) emit(2) delay(1000) emit(3) }.collect { println(it) } } ``` 在这个例子中,我们使用 flow 函数创建了一个流,并在其中使用 delay 函数实现了延迟。collect 函数用于收集流中的数据,并在控制台打印出来。 当运行此代码时,它将输出以下内容: ``` 1 2 3 ``` 这表明我们的延迟代码已经成功执行。 ### 回答2: Kotlin FlowKotlin协程中的一个库,用于异步流处理。在Kotlin Flow实现延迟代码的方法有很多。 一种常见的延迟代码的方法是使用`flow`函数和`emit`操作符来创建一个简单的Flow。可以在Flow的代码块中使用`delay`函数来延迟代码的执行时间。例如: ```kotlin import kotlinx.coroutines.delay import kotlinx.coroutines.flow.* fun delayedFlow(): Flow<Int> = flow { for (i in 1..5) { delay(1000) // 延迟1秒 emit(i) // 发射数据 } } fun main() { delayedFlow() .onEach { println(it) } // 打印数据 .launchIn(GlobalScope) // 启动流 } ``` 在上面的示例中,`delayedFlow`函数是一个自定义的Flow,它会延迟1秒后依次发射1到5的整数数据。在`main`函数中,我们使用`onEach`操作符来打印Flow的每个数据,并使用`launchIn`函数启动了一个协程来收集数据。 除了使用`delay`函数,还可以使用`flow`构造器中的其他挂起函数来实现更复杂的延迟逻辑,例如`withTimeout`、`retry`等等,根据具体需求进行灵活的延迟操作。 总结起来,Kotlin Flow提供了丰富的函数和操作符来实现延迟代码的功能,可以根据具体的需求选择合适的方法来实现。以上只是其中一种常见的方式,你可以根据具体的需求来选择适合自己的方法。 ### 回答3: Kotlin FlowKotlin 协程库中的一个功能强大的异步流处理工具。它允许我们以声明性的方式处理异步数据流,并可以轻松地实现延迟代码的逻辑。 要实现延迟代码,可以使用 Flow 的 `delay` 操作符。`delay` 操作符可以在发射每个元素前添加一个延迟。 首先,我们需要创建一个 Flow 对象,可以使用 `flowOf` 函数来创建一个简单的流。然后,我们可以使用 `delay` 操作符来添加延迟。 例如,下面是一个实现延迟代码的示例: ```kotlin import kotlinx.coroutines.delay import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.flow import kotlinx.coroutines.runBlocking fun main() { runBlocking { // 创建一个 Flow 对象,并在每个元素之间添加延迟 val flow = flowOf(1, 2, 3) .delayEach(1000) // 收集 Flow 中的元素 flow.collect { value -> println(value) } } } suspend fun <T> Flow<T>.delayEach(timeMillis: Long): Flow<T> = flow { collect { value -> delay(timeMillis) emit(value) } } ``` 在这个示例中,我们创建了一个带有延迟的 Flow 对象,其中 `1`、`2`、`3` 依次发射,并且每个元素之间延迟 1000 毫秒。然后我们使用 `collect` 函数来收集 Flow 中的元素,并在控制台中打印每个元素。 通过使用 `delay` 操作符,我们可以轻松地实现延迟代码的逻辑,并在流中处理异步任务。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值