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() }
方案优势
- 线程安全:使用
ConcurrentLinkedQueue确保队列操作可靠,适配潜在的多线程场景。 - 配置变化兼容:通过
ViewModel保存队列和状态,避免屏幕旋转等场景下数据丢失。 - 逻辑解耦:将状态管理与UI逻辑分离,代码结构更清晰、易维护。
内容的提问来源于stack exchange,提问作者dana
相关产品推荐
相关产品推荐

