Android实现练习题答题超时自动跳转下一题的最优方案咨询
Android 练习题超时自动切题最优实现方案
现有实现的缺陷
你当前的忙等方案存在严重问题:
while (!future.isDone()) {}会持续占用主线程CPU资源,直接导致界面卡顿、用户输入无响应,甚至触发ANR(应用无响应)崩溃,完全不适合生产环境使用- 额外创建线程池执行休眠任务属于不必要的资源浪费
CountDownTimer 取消失效的原因
多数情况下不是cancel()方法本身无效,而是调用取消时,倒计时的结束回调消息已经被发送到主线程消息队列,就算取消了定时器,已经入队的消息依然会执行,看起来就像取消没生效,只要额外加状态校验就能解决,但整体灵活性不如下面的方案。
最优实现方案
Kotlin 协程方案(当前Android官方首选)
基于页面生命周期作用域的协程实现,无需手动管理线程/定时器,自动适配生命周期避免内存泄漏:
// 保存当前题目的倒计时任务 private var currentCountdownJob: Job? = null // 加载下一题逻辑 private fun loadNextExercise() { // 先取消上一道题的倒计时 currentCountdownJob?.cancel() // 替换Fragment展示新题 supportFragmentManager.beginTransaction() .replace(R.id.exercise_container, getNextExercise()) .commit() // 启动新的5秒倒计时 currentCountdownJob = lifecycleScope.launch { delay(5000) // 超时自动加载下一题 loadNextExercise() } } // 用户作答回调中调用即可切题 fun onUserAnswer() { // 处理用户作答逻辑 // ... // 直接加载下一题,内部会自动取消当前倒计时 loadNextExercise() }
Java Handler 方案
基于Android原生消息机制实现,轻量可靠,取消逻辑无歧义:
// 全局变量 private final Handler mainHandler = new Handler(Looper.getMainLooper()); private Runnable currentCountdownRunnable; private void loadNextExercise() { // 先取消上一题的倒计时 if (currentCountdownRunnable != null) { mainHandler.removeCallbacks(currentCountdownRunnable); } // 展示新题 getSupportFragmentManager().beginTransaction() .replace(R.id.exercise_container, getNextExercise()) .commit(); // 创建倒计时任务 currentCountdownRunnable = new Runnable() { @Override public void run() { // 超时自动切题 loadNextExercise(); } }; // 延迟5秒执行 mainHandler.postDelayed(currentCountdownRunnable, 5000); } // 用户作答回调 public void onUserAnswer() { // 处理用户作答逻辑 // ... loadNextExercise(); } // 页面销毁时清空所有任务避免内存泄漏 @Override protected void onDestroy() { super.onDestroy(); mainHandler.removeCallbacksAndMessages(null); }
内容的提问来源于stack exchange,提问作者J.Doe
相关产品推荐
相关产品推荐

