日常知识通
柔彩主题三 · 更轻盈的阅读体验

Kotlin协程延迟执行的实用场景与写法

发布时间:2025-12-15 13:01:23 阅读:393 次

什么时候需要延迟执行

在开发一个天气类App时,用户下拉刷新后,我们希望界面稍等两秒再显示“暂无更新”,而不是立刻弹出提示。这种“等一等”的需求,就是延迟执行的典型场景。Kotlin协程提供了简洁的方式实现这一点。

用 delay 实现协程中的暂停

Kotlin协程中,delay 是最常用的延迟方法。它不会像 Thread.sleep 那样阻塞线程,而是挂起协程,释放线程资源。比如下面这段代码:

viewModelScope.launch {
// 显示加载状态
_uiState.value = Loading

// 延迟1.5秒
delay(1500)

// 更新数据状态
_uiState.value = DataUpdated
}

这段逻辑常用于模拟网络请求延时,在测试UI交互时特别有用。

避免主线程卡顿的小技巧

Android 主线程不能被阻塞,但传统 sleep 会卡住界面。而 delay 只是暂时挂起当前协程,主线程可以继续处理其他任务。例如在倒计时按钮中:

val job = CoroutineScope(Dispatchers.Main).launch {
for (i in 5 downTo 1) {
button.text = "重新发送($i)"
delay(1000)
}
button.text = "点击重发"
button.isEnabled = true
}

这样用户依然能滑动页面,按钮也不会变灰无响应。

结合 withContext 控制执行环境

有时候我们需要先延迟,再切换到特定线程处理数据。withContext 和 delay 搭配很顺手:

launch {
delay(800) // 稍等片刻
val result = withContext(Dispatchers.IO) {
// 在IO线程加载数据
fetchDataFromNetwork()
}
updateUi(result)
}

这种组合在启动页做预加载时很常见,既给了动画播放时间,又不耽误后台准备数据。

取消延迟:别忘了可取消性

协程的 delay 是可取消的。如果用户在倒计时期间退出页面,记得取消协程,避免内存泄漏:

override fun onDestroy() {
job.cancel() // 已经 delay 的任务会立即终止
super.onDestroy()
}

这个特性让延迟操作更安全,不像定时器那样容易失控。