首页 > 代码库 > 关于Chronometer(计时器)暂停的问题

关于Chronometer(计时器)暂停的问题

问题描述:

当通过stop()方法实现计时器暂停时,在通过start()方法继续计时的时候,会出现计时器显示的时间不是暂停前的时间。

问题分析:

         查看官方API文档可以发现:

publicvoid stop ()

Added in API level 1

Stop countingup. This does not affect the base as set from setBase(long), just the viewdisplay. This stops the messages to the handler, effectively releasing resourcesthat would be held as the chronometer is running, via start().

         stop()方法只是停止刷新计时器的时间显示,而并没有真正停止计时。当调用stop()方法后,计时器还在计时,只是不再刷新界面罢了

         那样怎么才生让计时器在恢复计时的时候能够从暂停前的时间继续计时呢?

下面有两种方法可以解决这个问题:

方法一:

开始和恢复计时:

//将时间设置为暂停时的时间
chronometer.setBase(convertStrTimeToLong(chronometer.getText().toString()));
chronometer.start();//开始计时
 

暂停计时:

 

chronometer.stop();//停止计时   

获取暂停前显示的时间并将其转换为long类型的时间:

/**
 * 将String类型的时间转换成long,如:12:01:08
 * @param strTime String类型的时间
 * @return long类型的时间
 * */
protected long convertStrTimeToLong(String strTime) {
    // TODO Auto-generated method stub
    String []timeArry=strTime.split(":");
    long longTime=0;
    if (timeArry.length==2) {//如果时间是MM:SS格式
        longTime=Integer.parseInt(timeArry[0])*1000*60+Integer.parseInt(timeArry[1])*1000;
    }else if (timeArry.length==3){//如果时间是HH:MM:SS格式
        longTime=Integer.parseInt(timeArry[0])*1000*60*60+Integer.parseInt(timeArry[1])
              *1000*60+Integer.parseInt(timeArry[0])*1000;
    }            
    return SystemClock.elapsedRealtime()-longTime;
}
 

方法二:

private Chronometer recordChronometer;
private long recordingTime = 0;// 记录下来的总时间
public void onRecordStart() {
    recordChronometer.setBase(SystemClock.elapsedRealtime() - recordingTime);// 跳过已经记录了的时间,起到继续计时的作用
    recordChronometer.start();
}
public void onRecordPause() {
    recordChronometer.stop();
    recordingTime = SystemClock.elapsedRealtime()- recordChronometer.getBase();// 保存这次记录了的时间
}
public void onRecordStop() {
    recordingTime = 0;
    recordChronometer.setBase(SystemClock.elapsedRealtime());
} 

关于Chronometer(计时器)暂停的问题