最近有个项目要实现记录时间推进的功能,之前百度了下,发现了android自带控件(Chronometer)可以实现这个功能,详见之前写的博客
http://blog.csdn.net/qq_21793463/article/details/49704121
但是Chronometer的自带api太少,无法适应太复杂的场景,比如暂停后Chronometer其实还是在记录时间,也无法很好的记录时间的推移量,所以就看了下Chronometer源码,加上自己理解写了小demo同样实现了计时器的功能,而且比Chronometer的交互会好一点,主要是自己还可以自定义更多的操作。 布局文件太简单,就是一个Textview和3个button,所以这里就不给出。 直接看代码:
public class MainActivity extends Activity {
private TextView tv_time;
private Timer timer;
private TimerTask timerTask;
private int totalSec = 0 ;
@Override
protected void onCreate (Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_time = (TextView) findViewById(R.id.tvTime);
}
private Handler handler = new Handler() {
public void handleMessage (android.os.Message msg) {
super .handleMessage(msg);
switch (msg.what) {
case 1 :
totalSec++;
int hour = totalSec / 3600 ;
int min = totalSec / 60 ;
if (min>=60 ){
min = min % 60 ;
}
int sec = totalSec % 60 ;
tv_time.setText(String.format("%1$02d:%2$02d:%3$02d" , hour, min, sec));
break ;
}
}
};
public void onButtonClick (View v) {
switch (v.getId()) {
case R.id.btnStart:
Toast.makeText(getApplicationContext(), "开始" , 0 ).show();
if (timer == null ) {
timer = new Timer(true );
}
if (timerTask == null ) {
timerTask = new TimerTask() {
@Override
public void run () {
handler.sendEmptyMessage(1 );
}
};
}
timer.schedule(timerTask, 1000 , 1000 );
break ;
case R.id.btnPause:
Toast.makeText(getApplicationContext(), "暂停" , 0 ).show();
if (timerTask != null && timerTask != null ) {
timerTask.cancel();
timerTask = null ;
timer.purge();
}
break ;
case R.id.btnStop:
Toast.makeText(getApplicationContext(), "停止" , 0 ).show();
if (timer != null && timerTask != null ) {
timerTask.cancel();
timerTask = null ;
timer.cancel();
timer.purge();
timer = null ;
handler.removeMessages(1 );
}
totalSec = 0 ;
tv_time.setText("00:00:00" );
break ;
}
}
}
代码也很简单,就是用timer 加 timerTask 和handler实现消息传递和任务的执行。 对代码里面的一些地方解释一下,也以便以后查阅
timer.schedule(timerTask, 1000, 1000);//延迟一秒执行任务,并每隔一秒在执行一次任务 源码解释:Schedule a task for repeated fixed-delay execution after a specific delay. (安排一个特定的任务重复的延迟执行) timer.schedule(timerTask, 1000);//延迟一秒执行任务,不会重复执行 源码解释:Schedule a task for single execution after a specified delay (安排一个特定任务延迟执行) timer.purge(); // 会删除timer里面所有被canceled的task任务 源码解释:Removes all canceled tasks from the task queue. If there are no other references on the tasks, then after this call they are free to be garbage collected. (从任务队列中删除所有已取消的任务。如果没有其他引用的任务,那么在此之后调用他们是免费的垃圾收集。)