android 使用协程CoroutineScope 实现定时器

满足延迟执行、立即执行,每次任务间隔时长,总时长的任务

使用1

Kotlin 复制代码
class TimeViewModel:Viewmodel(){

//测试延迟5秒开始执行任务,然后每隔1秒执行1次,总执行时间60秒
 fun testTime(){
      var startTime = System.currentTimeMillis()
      log("执行 开始 startTime:${startTime}")
      val job =  viewModelScope.startTime(
            interval = 5000,
            duration = 1000,
            totalTime = 60*1000,
            onNext = {count->
                log("执行次数:${count}")

            },
            onFinish = {
                log("执行结束")
                log("执行 结束 总耗时:${System.currentTimeMillis() - startTime}")
            }
        )



        viewModelScope.launch {

            delay(20000)
            log("模拟执行手动结束")
            job.cancel()
        }

    }

}

使用2

Kotlin 复制代码
 //立即执行任务,然后每隔1秒执行1次,总执行时间60秒
val job =  viewModelScope.startTime(
            duration = 1000,
            totalTime = 60*1000,
            onNext = {count->
                log("执行次数:${count}")

            },
            onFinish = {
                log("执行结束")
                log("执行 结束 总耗时:${System.currentTimeMillis() - startTime}")
            }
        )

使用3

Kotlin 复制代码
 /*
 立即执行任务,然后每间隔1秒执行1次,
 要么手动调用 job.cancel(),要么等所在协程生命周期结束,才会结束,但不会回调 onFinish 
*/
 val job =  viewModelScope.startTime(
            duration = 1000,
 
            onNext = {count->
                log("执行次数:${count}")
            },
            onFinish = {
                log("执行结束")
                log("执行 结束 总耗时:${System.currentTimeMillis() - startTime}")
            }
        )

 

使用4

Kotlin 复制代码
  /*
 延迟5秒再执行任务,然后每间隔1秒执行1次,
 要么手动调用 job.cancel(),要么等所在协程生命周期结束,才会结束,但不会回调 onFinish 
*/ 
 val job =  viewModelScope.startTime(
            interval = 5000,
            duration = 1000,
 
            onNext = {count->
                log("执行次数:${count}")
            },
            onFinish = {
                log("执行结束")
                log("执行 结束 总耗时:${System.currentTimeMillis() - startTime}")
            }
        )

//代码封装

Kotlin 复制代码
/**
     * @param interval 单位毫秒,用于定时器延迟时间开启,例如:interval = 5000,则是5秒后才会开始倒计时
     * @param duration 单位毫秒,用户每次定时任务间隔时长执行1次,例如 duration = 1000,则每间隔1秒执行1次
     * @param totalTime 单位毫秒,用于定时器执行的总时长,
     *        如果为空的话,会一直在运行,直到手动调用cancel 方法,或者所在协程声明周期结束 而结束
     * @onNext(count) ,返回每次执行的次数
     * @onFinish() 任务正常执行完成
     */
      fun CoroutineScope.startTime(
          interval:Long? = 0,
          duration:Long,
          totalTime:Long? = null,
          onNext:(Int)->Unit,
          onFinish:(()->Unit)? = null
    ):Job{
          if (duration<=0){
              throw IllegalArgumentException("间隔时间必须大于0")
          }
        return this.launch {
            interval?.let { _interval->
                if (_interval>0){
                    delay(_interval)
                }
            }

            var isStart = true
            var runAllTotalTime:Long = 0
            var count = 0
            while (isStart){
                if (totalTime!= null && totalTime>0 && runAllTotalTime>= totalTime){
                    isStart = false
                    onFinish?.invoke()
                }else{
                    delay(duration)
                    runAllTotalTime+=duration
                    count+=1
                    onNext.invoke(count)
                }
            }
        }
    }
相关推荐
Dovis(誓平步青云)38 分钟前
家里设备越来越多,如何用一张空间地图控制灯光和温度![
android·java·前端·javascript·人工智能·电脑
晚风叙码2 小时前
MySQL 数据类型详解:从数值到字符串,一篇讲透
android·mysql·adb
传奇开心果编程3 小时前
【Compose Multiplatform 跨端开发学与练】第3课 布局与组件
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程6 小时前
【Compose Multiplatform 跨端开发学与练】第8课 资源管理与主题
android·windows·学习·ios·kotlin·web·composer
传奇开心果编程7 小时前
【Compose Multiplatform 跨端开发学与练】第9课 测试与调试
android·学习·macos·ios·kotlin·web·composer
传奇开心果编程7 小时前
【Compose Multiplatform 跨端开发学与练】第4课 导航与路由
android·windows·学习·ui·ios·kotlin·composer
传奇开心果编程8 小时前
【Compose Multiplatform 跨端开发学与练】第6课 状态管理与架构
android·学习·ui·ios·架构·kotlin·composer
事圆则缓8 小时前
Android AOSP 定制常见概念:源码目录、系统镜像与刷机流程
android
传奇开心果编程8 小时前
【Compose Multiplatform 跨端开发学与练】第2课 Compose 基础语法
android·windows·学习·ui·ios·kotlin·composer
supabc1238 小时前
Celium:连接 Windows、Mac、Linux 与 Android,让远程访问和设备管理更简单
android·linux·windows·macos·远程访问·网络管理·celium