数码世界
第二套高阶模板 · 更大气的阅读体验

Kotlin协程延迟执行:让代码“等一等”更优雅

发布时间:2025-12-15 13:02:03 阅读:429 次

写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交互复杂的环境里,能把异步流程写得像同步一样直白,真省心。