Kotlin-定时任务

前言

在 Kotlin 中实现定时任务有多种方式:

  • Timer/TimerTask:简单易用,但功能有限,在多线程环境下可能存在问题。
  • 协程:Kotlin 推荐方式,非阻塞特性好,内存效率高,适合 Android 等场景。

使用 Timer 和 TimerTask(Java 标准库)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
fun startTimerTask() {
val timer = Timer()

// 延迟 1 秒后执行,之后每隔 2 秒执行一次
timer.schedule(object : TimerTask() {
override fun run() {
println("定时任务执行: ${System.currentTimeMillis()}")
}
}, 1000, 1000)

// 5 秒后取消定时任务
Timer().schedule(5000) {
timer.cancel()
println("定时任务已取消")
}
}

使用协程(Kotlin 推荐方式)

延迟执行

1
2
3
4
5
6
7
8
9
10
import kotlinx.coroutines.*
import kotlinx.coroutines.delay

fun main() = runBlocking {
// 单次延迟执行
launch {
delay(1000) // 非阻塞延迟 1 秒
println("延迟任务执行")
}
}

循环执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import kotlinx.coroutines.*
import kotlinx.coroutines.delay

fun main() = runBlocking {
// 周期性执行任务
val periodicJob = launch {
while (isActive) { // 检查协程是否活跃
println("周期性任务执行: ${System.currentTimeMillis()}")
delay(2000) // 每隔 2 秒执行一次
}
}

// 5 秒后取消周期性任务
delay(5000)
periodicJob.cancel()
println("周期性任务已取消")
}

Android ViewModel中使用

1
2
3
4
5
6
7
8
fun startTimerTask() {
viewModelScope.launch {
while (isActive) { // 检查协程是否活跃
println("周期性任务执行: ${System.currentTimeMillis()}")
delay(1000) // 每隔 1 秒执行一次
}
}
}