You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin实现用户请求队列化执行liveTimer()方案咨询

Android Kotlin 实现点击请求排队处理的最优方案

核心思路是通过请求队列管理重复点击,配合执行状态标记控制任务执行顺序,确保同一时间只有一个liveTimer()在运行,待当前任务完成后自动处理队列中的后续请求。

步骤1:定义状态管理与队列

使用ViewModel保存队列和执行状态,避免因配置变化(如屏幕旋转)导致数据丢失:

import androidx.lifecycle.ViewModel
import java.util.concurrent.ConcurrentLinkedQueue

class CameraRequestViewModel : ViewModel() {
    // 线程安全的请求队列,存储待执行的任务
    val requestQueue = ConcurrentLinkedQueue<Runnable>()
    // 标记当前是否正在处理任务
    var isProcessing = false
}

步骤2:在Activity中初始化ViewModel并修改点击事件

class HomeActivity : AppCompatActivity() {
    private lateinit var viewModel: CameraRequestViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_home)
        
        viewModel = ViewModelProvider(this)[CameraRequestViewModel::class.java]
        
        cameraBt.setOnClickListener {
            if (viewModel.isProcessing) {
                // 当前有任务在执行,将请求加入队列
                viewModel.requestQueue.add(Runnable { liveTimer() })
            } else {
                // 无任务执行,直接处理当前请求
                processNextRequest()
            }
        }
    }

    // 处理队列中的下一个请求
    private fun processNextRequest() {
        if (!viewModel.isProcessing && viewModel.requestQueue.isNotEmpty()) {
            viewModel.isProcessing = true
            val nextTask = viewModel.requestQueue.poll()
            nextTask.run()
        }
    }
}

步骤3:修改liveTimer()方法,任务完成后触发下一个请求

private fun liveTimer() {
    val intent = Intent(this, HomeActivity::class.java)
    val cameraIntent = Intent(Intent.ACTION_VIEW)
    cameraIntent.data = Uri.parse("https://shielded-fortress-04099.herokuapp.com/")
    startActivity(cameraIntent)

    val timer = object : CountDownTimer(30 * 1000, 1000) {
        override fun onTick(timeLeft: Long) {
            // 可选:添加倒计时更新逻辑
        }

        override fun onFinish() {
            startActivity(intent)
            Toast.makeText(
                this@HomeActivity,
                "the allowed time has finished",
                Toast.LENGTH_LONG
            ).show()
            
            // 标记当前任务完成,启动下一个队列任务
            viewModel.isProcessing = false
            processNextRequest()
        }
    }.start()
}

方案优势

  1. 线程安全:使用ConcurrentLinkedQueue确保队列操作可靠,适配潜在的多线程场景。
  2. 配置变化兼容:通过ViewModel保存队列和状态,避免屏幕旋转等场景下数据丢失。
  3. 逻辑解耦:将状态管理与UI逻辑分离,代码结构更清晰、易维护。

内容的提问来源于stack exchange,提问作者dana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 23:31:12