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

沒關係,我解決了這個問題。這是顯示文本格式化的一個問題。受傷與同步無關。花太長的時間看錯了地方。