Android问答应用Java实现单题倒计时及切换重置方法
实现每题独立倒计时的问答应用(Java Activity版)
嘿,作为Android开发新手,想要搞定每道题对应独立倒计时、切换题目自动重置的功能其实很简单,我给你梳理清楚步骤,再配上完整代码示例,一看就懂~
核心思路
咱们用Android自带的CountDownTimer类来实现倒计时——这个类会帮我们处理时间递减、UI更新的逻辑,不用自己手动管理线程或者Handler。关键是每切换一道题,就取消当前正在运行的倒计时,然后重新创建并启动一个新的倒计时实例,这样就能保证每题的倒计时都是独立的。
具体实现步骤
1. 先写布局文件(activity_main.xml)
咱们需要几个基础控件:显示倒计时的文本、显示题目的文本、切换下一题的按钮。示例布局如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="16dp" android:gravity="center"> <!-- 倒计时显示 --> <TextView android:id="@+id/tv_countdown" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="30" android:textSize="48sp" android:textColor="#FF5722" android:layout_marginBottom="32dp"/> <!-- 题目显示 --> <TextView android:id="@+id/tv_question" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="第一题:Android中CountDownTimer的作用是什么?" android:textSize="20sp" android:layout_marginBottom="32dp"/> <!-- 切换下一题按钮 --> <Button android:id="@+id/btn_next_question" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="下一题"/> </LinearLayout>
2. 编写Activity逻辑(MainActivity.java)
这里要做的事情:初始化题目列表、管理倒计时实例、切换题目时重置倒计时。代码里我加了详细注释,你跟着看就行:
import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.os.CountDownTimer; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends AppCompatActivity { // 倒计时时长(每题30秒,单位毫秒) private static final long COUNTDOWN_DURATION = 30 * 1000; // 倒计时更新间隔(每秒更新一次UI) private static final long COUNT_INTERVAL = 1000; private TextView tvCountdown; private TextView tvQuestion; private Button btnNextQuestion; // 当前运行的倒计时实例,用来切换题目时取消旧的倒计时 private CountDownTimer currentCountDownTimer; // 当前题目索引 private int currentQuestionIndex = 0; // 题目列表,你可以自己扩展更多题目 private String[] questions = { "第一题:Android中CountDownTimer的作用是什么?", "第二题:Activity的生命周期有哪几个阶段?", "第三题:什么是Intent?它的作用是什么?", "第四题:RecyclerView和ListView的区别是什么?" }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化控件 tvCountdown = findViewById(R.id.tv_countdown); tvQuestion = findViewById(R.id.tv_question); btnNextQuestion = findViewById(R.id.btn_next_question); // 启动第一道题的倒计时 startCountdown(); // 切换下一题的点击事件 btnNextQuestion.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 切换到下一题索引,循环展示 currentQuestionIndex = (currentQuestionIndex + 1) % questions.length; // 更新题目文本 tvQuestion.setText(questions[currentQuestionIndex]); // 重置倒计时:先取消旧的,再启动新的 resetCountdown(); } }); } /** * 启动倒计时的方法 */ private void startCountdown() { // 创建新的倒计时实例 currentCountDownTimer = new CountDownTimer(COUNTDOWN_DURATION, COUNT_INTERVAL) { @Override public void onTick(long millisUntilFinished) { // 每秒更新倒计时文本,把毫秒转成秒 long secondsLeft = millisUntilFinished / 1000; tvCountdown.setText(String.valueOf(secondsLeft)); } @Override public void onFinish() { // 倒计时结束后的逻辑:比如自动跳转到下一题,或者提示超时 tvCountdown.setText("时间到!"); // 这里可以自动触发下一题,和点击按钮逻辑一致 currentQuestionIndex = (currentQuestionIndex + 1) % questions.length; tvQuestion.setText(questions[currentQuestionIndex]); resetCountdown(); } }; // 启动倒计时 currentCountDownTimer.start(); } /** * 重置倒计时的方法:取消旧的,启动新的 */ private void resetCountdown() { // 先判断当前倒计时是否存在,如果存在就取消,避免内存泄漏 if (currentCountDownTimer != null) { currentCountDownTimer.cancel(); } // 启动新的倒计时 startCountdown(); } /** * Activity销毁时,一定要取消倒计时,防止内存泄漏 */ @Override protected void onDestroy() { super.onDestroy(); if (currentCountDownTimer != null) { currentCountDownTimer.cancel(); } } }
关键注意点
- 及时取消倒计时:切换题目时、Activity销毁时,一定要调用
cancel()方法,不然倒计时会一直在后台运行,导致内存泄漏或者UI异常。 - 独立实例化:每道题都要创建新的
CountDownTimer实例,不能复用旧的,因为CountDownTimer启动后无法重置,只能取消后重新创建。 - 自定义时长:你可以修改
COUNTDOWN_DURATION变量,设置每题的倒计时时长,比如改成60秒就是60*1000。
这样一套下来,你的问答应用就能实现每题独立倒计时,切换题目自动重置的功能啦!
内容的提问来源于stack exchange,提问作者jane




