2011-12-06 1 views
1

特定の間隔で特定のタスクを実行する必要があるシナリオがありますが、再インスタンス化せずにタイマーをリセット/再開できるようにしたいと考えています。より良い理解のための私のコードはここにあります。Androidのjava.util.Timerリセットオプション

private TimerTask beatTask = new TimerTask() { 
     @Override 
     public void run() { 
      beatDetected(); 
     } 
    }; 

public void beatDetected() { 
     timeoutTimer.cancel(); 

     // handle my stuff and restart the timer. 

     timeoutTimer.schedule(beatTask, 2000); 
    } 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 

     (timeoutTimer = new Timer()).schedule(beatTask, 2000); 

     return Service.START_STICKY; 
    } 

この実装の背後にある考え方は、beatDetected()が、その場合には次のタイマティックは、次のタスクのための経過時間をリセットする必要があり、すなわちその瞬間から起こるはず、外部のイベントから呼び出すことができるということです。しかし、私は最初のダニを取得し、その時点から、タイマーは動作しません。 私はTimerクラスを使用することに限らず、上記のシナリオを解決するものはすべて動作します。私はpostDelayedの使い方をしていましたが、このコードはサービス内にあり、UIスレッド対応の更新は必要ありません。

答えて

9

タイマーに別のスレッドを使用することは、Android搭載端末ではやや悪い方法です。これは、ほとんどのシナリオでリソースを無駄にするためです。

超精密なタイミングイベントを必要としない場合は、Handlerタイマーにする必要があります。そのようなタイマーの例をここに示す:Repeat a task with a time delay?。このアプローチは、アクティビティとサービスの両方で機能します。

デバイスがスリープモードになると、HandlerTimerの両方のタイマーが一時停止されることにも注意してください。これが必要なものでない場合は、AlarmManagerを使用してください(ただし、AlarmManagerを間違って使用すると、電池の性能が著しく低下することがあります)。

void resetRepeatingTask() { 
    mHandler.removeCallbacks(mBeatDetector); 
    mHandler.postDelayed(mBeatDetector, mInterval);   
} 
+0

私はHandlerとAlarmManagerを調べました。私の仕事が2秒ごとに繰り返されることを考えると、AlarmManagerは最良の選択肢ではありません。本質的にHandlerとTimerは同じことを行います。しかし、私の問題は、タイマ/ハンドラが動作している間に "次のティック"をリセットすることができます。 –

+0

Yeap、AlarmManagerはあまりにも重いです。 'Handler'をリセットするには' Handler.removeCallbacks() 'と' Handler.postDelayed() 'をもう一度呼びます。これにより、遅延が再開されます。 – inazaruk

+0

「リセットタイマー」の例で答えが更新されました。 – inazaruk

2

受け入れ答えは(少なくとも私にとっては)動作しません:HandlerベースのタイマーをReseting


簡単な解決策はTimerを使用してTimerTaskをトリガーします。これは簡単にリセットできます。

Log.d(TAG, "Restarting timer"); 
if (timer != null) { 
    timer.cancel(); 
} 
timer = new Timer(); 
timer.schedule(new TimerTask() { 
    @Override 
    public void run() { 
     Log.d(TAG, "Run the task"); 
    } 
}, 1000); 

新しいTimerTaskあなたはタイマーをリセットするたびに作成されなければならないことに注意してください - あなたは古いものを再利用することはできません。状態を保持したい場合は、タイマータスクを取得して別のタスクを実行する必要があります。

+0

それは私のために働いてくれてありがとう –

関連する問題