所以我正在尝试创建一个简单的计时器应用程序,将经过的时间输出到屏幕。我正在尝试合并一个暂停按钮。它似乎工作,除非按下暂停按钮关闭x:x:1~(min:sec:milli)的值,如果你再次取消暂停和再次快速复活,下一个显示的值将在x:x:N附近(N> ; 1)而不是x:x-1:9~。 Logcat输出如下。 DISPLAY是显示的时间(剩余时间,应该总是减少,但不是)。经过的时间是经过的内部时间(总是增加,所以看起来没问题)
10-09 23:28:16.152: D/ClockView(16547): ELAPSED TIME 1728
10-09 23:28:16.152: D/ClockView(16547): DISPLAY 0:8:272
10-09 23:28:16.252: D/ClockView(16547): ELAPSED TIME 1829
10-09 23:28:16.252: D/ClockView(16547): DISPLAY 0:8:171
10-09 23:28:16.282: D/ClockView(16547): PAUSE PRESSED
10-09 23:28:16.983: D/ClockView(16547): PAUSE PRESSED
10-09 23:28:16.983: D/ClockView(16547): ELAPSED TIME 1868
10-09 23:28:16.983: D/ClockView(16547): DISPLAY 0:8:132
10-09 23:28:17.083: D/ClockView(16547): ELAPSED TIME 1968
10-09 23:28:17.083: D/ClockView(16547): DISPLAY 0:8:32
10-09 23:28:17.123: D/ClockView(16547): PAUSE PRESSED
10-09 23:28:21.348: D/ClockView(16547): PAUSE PRESSED
10-09 23:28:21.348: D/ClockView(16547): ELAPSED TIME 2010
10-09 23:28:21.348: D/ClockView(16547): DISPLAY 0:7:990
10-09 23:28:21.448: D/ClockView(16547): ELAPSED TIME 2110
10-09 23:28:21.448: D/ClockView(16547): DISPLAY 0:7:890
以下代码:
public class ClockCallable implements Callable<Long> {
private long startTime = SystemClock.elapsedRealtime();
private long elapsedTime = 0;
private long pausedStartTime = 0;
private long pausedTime = 0;
Object o = new Object();
private volatile boolean paused = false;
public void pause() {
paused = true;
synchronized(o) {
pausedStartTime = SystemClock.elapsedRealtime();
}
}
public void resume() {
paused = false;
synchronized(o) {
pausedTime = SystemClock.elapsedRealtime() - pausedStartTime;
startTime += pausedTime;
o.notifyAll();
}
}
public void reset() {
paused = false;
synchronized(o) {
clockCallable.startTime = SystemClock.elapsedRealtime();
clockCallable.elapsedTime = 0;
clockCallable.pausedStartTime = 0;
clockCallable.pausedTime = 0;
o.notifyAll();
}
}
@Override
public Long call() throws Exception {
try {
while (elapsedTime < maxTime && !Thread.currentThread().isInterrupted()) {
if (!paused) {
elapsedTime = SystemClock.elapsedRealtime() - startTime;
Log.d(TAG, "ELAPSED TIME " + elapsedTime);
handler.post(new Runnable() { //To post to UI thread
@Override
public void run() {
synchronized(o) {
updateTextView(elapsedTime);
}
}
});
Thread.sleep(100); //Prevent too much work on its main thread
if (Thread.currentThread().isInterrupted()) {
return (long) -1; //For future.cancel() handling
}
}
else {
try {
while(paused) {
synchronized(o) {
o.wait();
}
}
}
catch (InterruptedException e) {}
}
}
}
catch (InterruptedException e) {
e.printStackTrace();
return (long) -1; //For future.cancel() handling
}
return (long) 1;
}
}
答案 0 :(得分:0)
没关系,我解决了这个问题。这是显示文本格式化方式的问题。与同步无关。花了太长时间在错误的地方看。