Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 呼叫停止后,计时器仍在运行?_Android_Performance_Chronometer_System Clock - Fatal编程技术网

Android 呼叫停止后,计时器仍在运行?

Android 呼叫停止后,计时器仍在运行?,android,performance,chronometer,system-clock,Android,Performance,Chronometer,System Clock,我正在尝试实现一个小时分秒格式的计时器。当我叫“停止”时,计时表仍在计时,一旦我再次启动计时表,计时表就会被加进去。我也不想让计时器复位,因此只想恢复它 这是我的代码: 创建时: Chronometer myChronometer; long time; myChronometer =(Chronometer) findViewById(R.id.chronometer); myChronometer .setOnChronometerTickListener(this);

我正在尝试实现一个小时分秒格式的计时器。当我叫“停止”时,计时表仍在计时,一旦我再次启动计时表,计时表就会被加进去。我也不想让计时器复位,因此只想恢复它

这是我的代码:

创建时:

Chronometer myChronometer;
long time;
myChronometer =(Chronometer) findViewById(R.id.chronometer);
        myChronometer .setOnChronometerTickListener(this);
        myChronometer .setBase(SystemClock.elapsedRealtime()+time);
计时方法:

 @Override
    public void onChronometerTick(Chronometer cArg) {
       time = SystemClock.elapsedRealtime() - cArg.getBase();

        int h   = (int)(time /3600000);
        int m = (int)(time - h*3600000)/60000;
        int s= (int)(time - h*3600000- m*60000)/1000 ;
        String hh = h < 10 ? "0"+h: h+"";
        String mm = m < 10 ? "0"+m: m+"";
        String ss = s < 10 ? "0"+s: s+"";
        cArg.setText(hh+":"+mm+":"+ss);
    }
@覆盖
计时器上的公共空隙(计时器卡){
time=SystemClock.elapsedRealtime()-cArg.getBase();
int h=(int)(时间/3600000);
int m=(int)(时间-h*3600000)/60000;
int s=(int)(时间-h*3600000-m*60000)/1000;
字符串hh=h<10?“0”+h:h+”;
字符串mm=m<10?“0”+m:m+”;
字符串ss=s<10?“0”+s:s+”;
cArg.setText(hh+“:“+mm+”:“+ss);
}

您可以在文档中阅读

别再数数了。这不会影响从收进(长)设置的基准,只影响视图显示

所以你必须重置你的计时器的底座。在开始按钮上执行以下操作:

        ((Button) findViewById(R.id.start)).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //THIS RESET YOUR CHRONOMETER BASE
                myChronometer.setBase(SystemClock.elapsedRealtime()); 
                myChronometer.start();
            }
        });

如果您想暂停或恢复您的计时表,您必须记录从暂停到单击所经过的时间,然后在开始时设置正确的基准:

long timeWhenStopped;

((Button) findViewById(R.id.start)).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        myChronometer.setBase(SystemClock.elapsedRealtime() + timeWhenStopped);
        myChronometer.start();
    }
});

((Button) findViewById(R.id.stop)).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        myChronometer.stop();
        timeWhenStopped = myChronometer.getBase() - SystemClock.elapsedRealtime();
    }
});

但这样做只会重置它。我不想重置计时器,虽然只是暂停它然后再继续。你的第二次编辑很有用,我依赖于我的时间变量,该变量在Chronometertick上更新,难怪我的计时器也从负计数到零,然后从0开始递增。非常感谢您抽出时间,祝您度过愉快的一天:)