Android实现自定义倒计时
在APP中,倒计时是非常重要的功能之一,比如游戏中的倒计时、秒杀活动的倒计时等等,都需要通过程序实现。在Android中实现倒计时功能可以采用两种方法:CountDownTimer和Handler。
1.CountDownTimer方式实现
CountDownTimer是Android自带的一个计时器类,通过onTick和onFinish两个方法分别实现计时过程和倒计时结束时的操作。下面结合一个实例来讲解CountDownTimer的使用方法。
(1)首先创建一个activity,布局XML文件里加入一个TextView用于显示倒计时。activity的代码如下:
public class MainActivity extends AppCompatActivity {
private TextView tv_count_down;
private CountDownTimer timer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_count_down = (TextView) findViewById(R.id.tv_count_down);
timer = new CountDownTimer(60*1000, 1000) {
@Override
public void onTick(long l) {
tv_count_down.setText("倒计时:" + l / 1000 + "秒");
}
@Override
public void onFinish() {
tv_count_down.setText("倒计时结束");
}
};
timer.start();
}
}
(2)代码解释:创建一个CountDownTimer对象,并重写onTick和onFinish方法用于分别实现计时过程和倒计时结束时的操作。onTick方法的参数为long类型,表示剩余时间的毫秒数。在onTick方法中更新显示倒计时的TextView文本,并在onFinish方法中更新显示倒计时结束的TextView文本。倒计时的总时间为60秒,每隔一秒进行一次倒计时。
(3)效果截图:
在60秒的倒计时过程中,TextView会不断更新显示剩余的时间,当时间到了60秒时会显示“倒计时结束”。
2.Handler方式实现
Handler方式实现倒计时比CountDownTimer稍微复杂一些,但也有其应用场景。例如在实现定时任务的过程中,需要不断执行某个操作直到到达指定的时间点,这种情况下就需要采用Handler方式实现倒计时。下面结合一个实例来讲解Handler的使用方法。
(1)创建一个Utility类,该类包含一个静态方法runOnUiThread,用来将指定代码块运行在UI线程中。
public class Utility {
public static void runOnUiThread(Runnable action) {
if (Thread.currentThread() != Looper.getMainLooper().getThread()) {
new Handler(Looper.getMainLooper()).post(action);
} else {
action.run();
}
}
}
(2)创建一个TimerThread类,该类继承自Thread,并重写run方法实现倒计时过程。代码如下:
public class TimerThread extends Thread {
private final Handler m_handler;
private int m_second;
public TimerThread(Handler handler, int second) {
m_handler = handler;
m_second = second;
}
@Override
public void run() {
while (m_second > 0) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
m_second--;
Utility.runOnUiThread(new Runnable() {
@Override
public void run() {
m_handler.obtainMessage(0, "倒计时:" + m_second + "秒").sendToTarget();
}
});
}
Utility.runOnUiThread(new Runnable() {
@Override
public void run() {
m_handler.obtainMessage(0, "倒计时结束").sendToTarget();
}
});
}
}
(3)创建一个activity,布局XML文件里加入一个TextView用于显示倒计时。activity的代码如下:
public class MainActivity extends AppCompatActivity {
private TextView tv_count_down;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_count_down = (TextView) findViewById(R.id.tv_count_down);
final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
tv_count_down.setText((String) msg.obj);
}
};
TimerThread thread = new TimerThread(handler, 60);
thread.start();
}
}
(4)代码解释:在activity中创建一个Handler对象,并用TimerThread类实现倒计时过程,然后通过Handler对象更新TextView显示的文本内容。在TimerThread类的run方法中,采用while循环实现倒计时,并在每次减一秒时通过runOnUiThread方法将代码块运行在UI线程中,以更新TextView显示的文本内容。
(5)效果截图:
同样是60秒的倒计时过程,TextView也会不断更新显示剩余的时间,当时间到了60秒时会显示“倒计时结束”。
总结:
两种方式均能实现倒计时功能,CountDownTimer实现方式简单,但有一定的灵活性局限性,适用于倒计时时间不变的情况;Handler实现方式复杂,但具有更大的灵活性,能应对更复杂的倒计时场景。
