2012-05-02 9 views
1

私は、連続して実行するためにTimerTaskをスケジュールするTimerを持っています。私はそれが何度働くか分からない。ユーザーがクリックするとタイマーは停止し、別のタイマーは再び実行されます。すべては、停止するまで動作します。スケジュールを変更すると、タイマーがキャンセルされたか、既にスケジュールされているという例外が表示されます。どうやって止めてもう一度走らせるの?私は考えることができるすべてを試しましたが、それはまだ動作していません。アンドロイドのTimerを再調整する

 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をを再スケジュールすることはできません。

は、これは私がしようとしている最新のコードです。毎回新しいものが必要です。さらに、HandlersとpostDelayedを使用することがアンドロイドで推奨されています。

+0

うーむ、しかし、ハンドラーで繰り返しタスクをスケジュールするにはどうすればよいですか?それはちょうどタスクを遅らせる、それは最後のものを終えた後に新しいものを動かす時間の期間を設定しない。 – user1347945

+0

通常、タスク自体から再度handler.postDelayed()を呼び出します。この定期的なタスクをキャンセルするには、handler.removeCallbacksAndMessagesを呼び出します。 –

+0

hmmmm、okこれは私が考えていることです。タスクが終了する直前にそのタスク自体がhandler.postDelay()を呼び出さないようにします。それは良いデザインですか? – user1347945

0

あなたのための完璧なソリューションは、あなたが投稿したコールバックを削除してから実行するためにスケジュールを変更する必要があなたのmultirepeatingコードでハンドラに続いて

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 
    } 
}; 

を使用することです。私の意見では

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); 

} 

} 
関連する問題