写Android应用时,经常会遇到需要延迟执行某个操作的场景。比如用户输入完搜索关键词后,不想立刻发起请求,而是等他停顿500毫秒后再去查询,避免频繁调用接口。以前可能靠Handler.postDelayed来回倒腾,代码嵌套多,读起来费劲。现在用Kotlin协程的延迟执行,写起来清爽多了。
用 delay 轻松实现延时
Kotlin协程提供了 delay 函数,可以直接挂起当前协程,等指定时间后再继续往下走,不会阻塞线程。这比开子线程+sleep或者发消息到Handler要直观得多。
viewModelScope.launch {
<span class="comment">// 用户停止输入0.5秒后才执行搜索</span>
delay(500)
searchRepository.search(query)
}
上面这段代码在ViewModel里很常见。用户每输入一个字符都会触发一次这个协程,但因为开头有 delay(500),前面还没执行完的会被取消掉,只有最后一次输入后的那个协程能走到搜索逻辑,完美实现防抖。
实际开发中的小技巧
有时候需要做倒计时按钮,比如发送验证码后显示“60秒后重试”。以前得开Timer或者用Handler循环发消息,现在用协程几行就搞定。
var countdown = 60
val job = CoroutineScope(Dispatchers.Main).launch {
while (countdown > 0) {
buttonText = "${countdown--}秒后重试"
delay(1000)
}
buttonText = "重新发送"
}
如果中途页面关闭了,记得在onCleared或onDestroy里把job取消,不然可能会引发内存泄漏。这种细节在真实项目里特别容易踩坑。
还有一种情况是页面刚打开时想稍微“等等”,等动画播完再弹个引导提示。这时候也可以用 delay 控制节奏,不用非得监听动画结束回调。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewLifecycleOwner.lifecycleScope.launch {
delay(800) // 等页面入场动画差不多了
showTutorialDialog()
}
}
这种小延迟能让交互看起来更自然,像是有人在背后默默配合操作节奏。
协程的延迟执行不是什么高深技术,但它改变了我们处理时间相关逻辑的方式。以前各种回调、定时器满天飞,现在统一用 delay + 协程结构化并发来管理,代码清晰不少。尤其在Android这种UI交互复杂的环境里,能把异步流程写得像同步一样直白,真省心。