2012-05-02 64 views
1

我想要有一個計時器爲連續執行計劃一個TimerTask。我不知道它會工作多少次。在用戶單擊時,計時器將停止,並在另一個計時器上再次運行。一切工作,直到停止,當我重新安排,我收到異常說,定時器被取消或已經安排。我如何讓它停止並再次運行?我試過了我能想到的一切,但仍然無法正常工作。在android中重新安排定時器

這是我想要的最新代碼:

 Timer myTimer; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    cameraTimedTask = new camera(this); 

     myTimer = new Timer("cameraTimer"); 

     Button b=(Button)findViewById(R.id.b); 
     b.setOnClickListener(new OnClickListener(){ 
      public void onClick(View v) { 
       myTimer.purge(); 
       myTimer.scheduleAtFixedRate(cameraTimedTask, 1000, 5000); 
      } 
     }); 

     Button bb=(Button)findViewById(R.id.button); 
     bb.setOnClickListener(new OnClickListener(){ 
      public void onClick(View v) { 
       myTimer.cancel(); 
       myTimer.purge(); 
       myTimer = null; 
       myTimer = new Timer("camerasTimer"); 
       Log.i("Check","[main]"+" timer stopped"); 
      } 
     }); 

    } 

回答

2

不能重新安排一個TimerTask。你每次都需要一個新的。此外,在android中建議使用Handlers和postDelayed。

+0

hmmmm,但我如何安排處理程序中的重複任務?它只是推遲了一項任務,它沒有設定一段時間在完成最後一項之後運行一個新的任務。 – user1347945

+0

他們通常從任務本身再次調用handler.postDelayed()。要取消這個週期性的任務,他們調用handler.removeCallbacksAndMessages –

+0

hmmmm,那麼這就是我在想什麼,我會避免任務本身在它結束之前調用handler.postDelay()。這是一個很好的設計? – user1347945

0

爲您提供完美的解決方案是使用一個處理器

private Runnable runnable; 
private Handler handler; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    handler = new Handler(); 
    runnable = new Runnable() { 

    @Override 
    public void run() { 
      // run code delayed code in here once 
    } 
}; 

然後在你的multirepeating代碼,你必須刪除發佈的回調,然後重新安排執行。

handler.removeCallbacks(runnable); 
handler.postDelayed(runnable, 200); 
1
在我看來

,嘗試使用倒計時定時器,而不是定時器

快速用法:

new CountDownTimer(30000, 1000) { 

public void onTick(long millisUntilFinished) { 
    mTextField.setText("seconds remaining: " + millisUntilFinished/1000); 
} 

public void onFinish() { 
    mTextField.setText("done!"); 
} 
}.start(); 

,或者如果你想更復雜的東西:

public class MyCountDownTimer extends CountDownTimer { 
    public MyCountDownTimer(long startTime, long interval) { 
    super(startTime, interval); 

    } 
    @Override 
    public void onFinish() { 
    text.setText("Time's up!"); 
    } 

    @Override 
public void onTick(long millisUntilFinished) { 
text.setText("" + millisUntilFinished/1000); 

} 

}