2013-10-10 28 views
0

所以我试图创建一个简单的计时器应用程序,将经过的时间输出到屏幕。我正在尝试加入一个暂停按钮。它似乎工作,除非暂停按钮被关闭到x:x:1〜(min:sec:milli)的值,如果您再次取消暂停和快速重新使用,则下一个显示值将在x:x:N(N> 1)而不是x:x-1:9〜。下面的Logcat输出。 DISPLAY是显示的时间(剩余时间,应该总是减少,但不是)。经过时间是经过内部时间(总是越来越多,所以看起来这是确定)低于定时器textview显示不总是显示递减值,不同步

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

没关系,我解决了这个问题。这是显示文本格式化的一个问题。受伤与同步无关。花太长的时间看错了地方。