手机App里,有时候我们需要让某个操作晚一点再执行。比如用户输入完搜索关键词后,别立马发起请求,等他打完字再查,这样既省流量又减轻服务器压力。这时候,Kotlin协程里的延迟执行就派上用场了。
delay函数:协程里的“暂停键”
Kotlin协程提供了一个叫 delay 的函数,可以让你在不阻塞线程的情况下暂停一段时间。它不像传统的 Thread.sleep() 那样会卡住整个线程,而是挂起当前协程,把资源让给其他任务。
举个实际例子:你在做一个验证码倒计时功能,点击“发送验证码”后按钮变成“60秒后重试”,每秒减1。用协程实现就很顺滑:
lifecycleScope.launch {
for (i in 60 downTo 1) {
button.text = "${i}秒后重试"
delay(1000) // 暂停1秒
}
button.text = "重新发送"
button.isEnabled = true
}
避免频繁网络请求
在搜索框输入时,如果每个字母都触发请求,用户体验差还浪费资源。可以用延迟加去抖(debounce)的思路处理:
var job: Job? = null
editText.addTextChangedListener(object : TextWatcher {
override fun onTextChanged(s: CharSequence, _, _, _) {
job?.cancel() // 取消之前的任务
job = lifecycleScope.launch {
delay(300) // 等300毫秒
search(s.toString()) // 执行搜索
}
}
override fun beforeTextChanged(_, _, _, _) {}
override fun afterTextChanged(_) {}
})
这样,只有当用户停止输入300毫秒后才会真正发起搜索,既灵敏又不会太频繁。
注意别在主线程sleep
有些人图省事直接用 Thread.sleep(2000),结果界面卡住两秒,用户以为App崩了。协程的 delay 是非阻塞的,适合更新UI前的小等待,比如引导页停留、动画间隔等场景。
不过也要小心别滥用延迟。比如连续多个 delay 堆在一起,会让逻辑变得难以维护。该用状态管理还是得用,延迟只是个小帮手,不是万能药。