我有一个秒表,它工作正常,但是当我按下主页按钮或按钮关闭铃声并在一段时间后重新打开它时,我看到错误的时间在我的秒表中。请告诉我,我能做些什么来解决这个问题?
public class Stopwatch extends Activity {
Timer mTimer;
int second_f_p = 0, second_s_p = 0, millisecond = 0;
int minute_f_p = 0, minute_s_p;
int hour_f_p = 0, hour_s_p = 0;
int numberOfLap = 0;
TextView tv;
TextView TVlap;
Button btn_start;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_stopwatch);
btn_start = (Button) this.findViewById(R.id.button1);
tv = (TextView) this.findViewById(R.id.tvTime);
btn_start.setOnClickListener(new View.OnClickListener() {@Override
public void onClick(View arg0) {
btn_start.setClickable(false);
mTimer = new Timer();
mTimer.schedule(new TimerTask() {
@Override
public void run() {
timerMethod();
}
}, 0, 100);
}
});
Button btn_stop = (Button) this.findViewById(R.id.button2);
btn_stop.setOnClickListener(new View.OnClickListener() {@Override
public void onClick(View v) {
btn_start.setClickable(true);
mTimer.cancel();
}
});
Button btn_reset = (Button) this.findViewById(R.id.button4);
btn_reset.setOnClickListener(new View.OnClickListener() {@Override
public void onClick(View v) {
second_f_p = 0;
second_s_p = 0;
minute_f_p = 0;
minute_s_p = 0;
millisecond = 0;
hour_f_p = 0;
hour_s_p = 0;
numberOfLap = 0;
TVlap.setText("");
tv.setText(String.valueOf(hour_f_p) + String.valueOf(hour_s_p) + ":" + String.valueOf(minute_f_p) + String.valueOf(minute_s_p) + ":" + String.valueOf(second_f_p) + String.valueOf(second_s_p) + "." + String.valueOf(millisecond));
}
});
TVlap = (TextView) this.findViewById(R.id.tvLap);
Button btn_lap = (Button) this.findViewById(R.id.button3);
btn_lap.setOnClickListener(new View.OnClickListener() {@Override
public void onClick(View v) {
numberOfLap++;
TVlap.setText(TVlap.getText() + String.valueOf(numberOfLap) + ". " + String.valueOf(hour_f_p) + String.valueOf(hour_s_p) + ":" + String.valueOf(minute_f_p) + String.valueOf(minute_s_p) + ":" + String.valueOf(second_f_p) + String.valueOf(second_s_p) + "." + String.valueOf(millisecond) + "\n");
}
});
}
private void timerMethod() {
this.runOnUiThread(doSomething);
}
private final Runnable doSomething = new Runnable() {@Override
public void run() {
millisecond++;
if (millisecond == 10) {
second_s_p++;
millisecond = 0;
}
if (second_s_p == 10) {
second_f_p++;
second_s_p = 0;
}
if (second_f_p == 6) {
minute_s_p++;
second_f_p = 0;
}
if (minute_s_p == 10) {
minute_f_p++;
minute_s_p = 0;
}
if (minute_f_p == 6) {
hour_s_p++;
minute_f_p = 0;
}
if (hour_s_p == 10) {
hour_f_p++;
hour_s_p = 0;
}
if (hour_f_p == 9 && hour_s_p == 9) {
second_f_p = 0;
second_s_p = 0;
minute_f_p = 0;
minute_s_p = 0;
hour_f_p = 0;
hour_s_p = 0;
}
tv.setText(String.valueOf(hour_f_p) + String.valueOf(hour_s_p) + ":" + String.valueOf(minute_f_p) + String.valueOf(minute_s_p) + ":" + String.valueOf(second_f_p) + String.valueOf(second_s_p) + "." + String.valueOf(millisecond));
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_stopwatch, menu);
return true;
}
}
答案 0 :(得分:0)
见下面的代码链接
http://www.edumobile.org/android/android-development/stop-watch-example/
如果你看一下Chronometer类的来源,你会发现它没有在一个字段中存储经过的时间,并且每次需要更新显示时都会在内部计算它。
然而,在您自己的代码中执行相同操作相对容易:
long elapsedMillis = SystemClock.elapsedRealtime() - chronometerInstance.getBase();
这假设你已经开始了这样的事情:
chronometerInstance.setBase(SystemClock.elapsedRealtime());
chronometerInstance.start();
以下是一个完整的例子:
public class ChronoExample extends Activity {
Chronometer mChronometer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
mChronometer = new Chronometer(this);
layout.addView(mChronometer);
Button startButton = new Button(this);
startButton.setText("Start");
startButton.setOnClickListener(mStartListener);
layout.addView(startButton);
Button stopButton = new Button(this);
stopButton.setText("Stop");
stopButton.setOnClickListener(mStopListener);
layout.addView(stopButton);
Button resetButton = new Button(this);
resetButton.setText("Reset");
resetButton.setOnClickListener(mResetListener);
layout.addView(resetButton);
setContentView(layout);
}
private void showElapsedTime() {
long elapsedMillis = SystemClock.elapsedRealtime() - mChronometer.getBase();
Toast.makeText(ChronoExample.this, "Elapsed milliseconds: " + elapsedMillis,
Toast.LENGTH_SHORT).show();
}
View.OnClickListener mStartListener = new OnClickListener() {
public void onClick(View v) {
mChronometer.start();
showElapsedTime();
}
};
View.OnClickListener mStopListener = new OnClickListener() {
public void onClick(View v) {
mChronometer.stop();
showElapsedTime();
}
};
View.OnClickListener mResetListener = new OnClickListener() {
public void onClick(View v) {
mChronometer.setBase(SystemClock.elapsedRealtime());
showElapsedTime();
}
};
}
关于天文台表的一个有点令人困惑的事情是你无法真正将它用作秒表,它可以再次启动,停止和重新启动。当它运行时,它将始终显示自您上次重置它以来经过的时间,无论多少次以及您在此期间停止了多长时间。当它停止时,它只是停止更新显示。