如何使用Kotlin Coroutines在Android主线程实现带延迟的长按事件监听
协程替换实现方案
你需要先确保模块build.gradle中引入了lifecycle协程扩展(已引入可直接忽略):
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.6.2"
核心实现代码如下,效果和原有Handler逻辑完全对齐:
button.setOnLongClickListener { // 使用和页面生命周期绑定的协程作用域,避免内存泄漏 lifecycleScope.launch { // 按钮处于按下状态时持续循环执行 while (button.isPressed) { // 执行需要的UI操作,默认运行在主线程,和原Handler逻辑一致 Log.e("Press", "Thread name: ${Thread.currentThread().name} ") // 间隔500ms执行下一次 delay(500) } } true }
方案说明
- 逻辑完全对齐原有实现:长按触发后立刻执行第一次操作,之后每500ms执行一次,按钮松开后自动终止循环,不会产生残留任务
- 不需要手动管理回调移除,
lifecycleScope会在页面(Activity/Fragment)销毁时自动取消所有未完成的协程,从根源避免内存泄漏 - 所有逻辑默认运行在主线程,和原Handler使用主线程Looper的效果完全一致,可直接操作UI,不需要额外切换线程
- 如果是在自定义View中使用,可以替换为
viewLifecycleScope,或者自定义协程作用域并在View销毁时调用cancel()手动回收即可
内容的提问来源于stack exchange,提问作者Sharan
相关产品推荐
相关产品推荐

