2013-12-21 36 views
3

我檢查了所有關於如何暫停/恢復計時器的答案,但找不到解決方案。Android:暫停/恢復計時器或線程

我已經創建了一個計時器任務,它計算員工的工作時間並將其放入TextView中以顯示。下面

代碼:

Timer T = new Timer(); 
    T.scheduleAtFixedRate(new TimerTask() { 
     @Override 
     public void run() { 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        String workingTime = "Your effort is " 
          + format.format(Double.valueOf(hr)) + ":" 
          + format.format(Double.valueOf(min)) + ":" 
          + format.format(Double.valueOf(sec)) 
          + " till now for the day"; 
        storeEffort.setText(workingTime); 
        sec++; 
        if (sec > 59) { 
         sec = 0; 
         min = min + 1; 
        } 
        if (min > 59) { 
         min = 0; 
         hr = hr + 1; 
        } 
       } 
      }); 
     } 
    }, 1000, 1000); 

其中storeEffort是我的TextView,其示出卡在正在運行的線程(主要問題)內的努力的時間。我想用按鈕單擊暫停工作計時器,並在同一按鈕再次點擊時恢復工作計時器。是否有任何其他方式來完成這種任務?

回答

2

您的解決方案可能有一個小問題 - 您使用定時器計數的時間間隔,而沒有必要。您可以使用即StopWatch來計算已用時間。因此,不要在計時器作業中添加秒,而只需從該計時器中獲取已用時間。要暫停計時器,您可以撥打stopWatch.stop()並啓動它,您可以撥打stopWatch.start()

它看起來是這樣的:

Stopwatch stopwatch = Stopwatch.createStarted(); 

void startThreadUpdateTimer(){} 
    Timer T = new Timer(); 
    T.scheduleAtFixedRate(new TimerTask() { 
     @Override 
     public void run() { 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        String workingTime = "Your effort is " + sw.toString() + 
         " till now for the day";       
       } 
      }); 
     } 
    }, 1000, 1000); 
} 

public void pause(){ 
    if(stopwatch.isRunning()){ 
     stopwatch.stop(); 
    } 
} 

public void resume(){ 
    if(!stopwatch.isRunning()){ 
     stopwatch.start(); 
    } 
} 
+0

嗯週期性電話怎麼辦? –

+0

定期電話?我不確定我明白這是什麼。我的建議似乎與OP所要求的相同。 –

+0

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html#scheduleAtFixedRate(java.lang.Runnable,long,long,java.util.concurrent.TimeUnit)last兩個參數提供了執行任務的時間段 - 定期調用 –

1

UPDATE如果定時器需要從開始的每一秒時間啓動解決方案:

public class YourOuterClass extends Activity { 
    private YourTimerTask mTimerTask; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Button button; 
     button.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       if (mTimerTask != null && mTimerTask.isTaskActive()) { 
        mTimerTask.deactivateTimer(); 
        mTimerTask = null; 
       } else { 
        startTask(); 
       } 

      } 
     }); 
     ... 
    } 

    private class YourTimerTask extends TimerTask { 
     private boolean mIsTimerActive; 

     public YourTimer() { 
      mIsTimerActive = true; 
     } 

     public void deactivateTimer() { 
      mIsTimerActive = false; 
     } 

     public boolean isTaskActive() { 
      return mIsTimerActive; 
     } 

     @Override 
     public void run() { 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        String workingTime = "Your effort is " 
          + format.format(Double.valueOf(hr)) + ":" 
          + format.format(Double.valueOf(min)) + ":" 
          + format.format(Double.valueOf(sec)) 
          + " till now for the day"; 
        if (!mIsTimerActive) { 
         cancel(); // will cancel this timer instance 
        } 
        sec++; 
        if (sec > 59) { 
         sec = 0; 
         min = min + 1; 
        } 
        if (min > 59) { 
         min = 0; 
         hr = hr + 1; 
        } 
       } 
      }); 
     } 
    } 
... 
    private void startTask() { 
     Timer T = new Timer(); 
     mTimerTask = new YourTimertask(); 
     T.scheduleAtFixedRate(mTimerTask, 1000, 1000); 
    } 
} 
+0

..still我不能暫停計時器。當我點擊按鈕時,它只在前景上暫停,但仍然在後臺運行。而當我再次點擊按鈕時,它繼續當前時間而不是暫停。任何想法 – Ranjit

+0

@RanjitPati當然,只需重新設置每按一下按鈕的值。但是,如果你想從0重新啓動它,我認爲有更好的解決方案。我會在我的答案中加入它。 –

+0

對不起鮑里斯。你仍然不明白我的問題。我想暫停並恢復時間。最好的例子是多個swipein/swipeout。從開始刷卡在計數器開始,當你想出去一段時間,你必須刷卡,並在那裏停留時間。然後時間恢復,當你進來,並再次刷卡.. – Ranjit