2012-07-16 14 views
6

問題 アンドロイドで開発中にタイマーを停止する際に問題が発生しています。Androidで停止していないタイマ

タイマーはすでに停止しています。

次に、ヌル問題を解決するTimerTaskのようにメソッドの外にタイマーの初期化を移動しますが、timer.cancel();が呼び出されたときにキャンセルされません。

以下のコードは、録画を停止する際に、すでにヌルになっているタイマーの例です。

TimerTaskを

マイTimerTask ...クラスの内部ではなくメソッドと以下のコードの外

private TimerTask task = new TimerTask() { 
    @Override 
    public void run() { 
     Log.e("TRACK_RECORDING_SERVICE","Timer Running"); 
    } 
    }; 

タイマー&タイマスタート

私は、持っているが初期化されますタイマーを起動したいときに呼び出されるstartRecrodingメソッド...

public void startRecording(){ 
    timer = new Timer("Message Timer"); 
    timer.scheduleAtFixedRate(this.task, 0, 1000); 
} 

タイマーストップ

私はタイマーを停止したいとき、私はその後、すべてのヘルプははるかに高く評価されるだろう...

public void stopRecording() { 
    if (timer != null) { 
     timer.cancel(); 
     timer = null; 
    } else { 
     Log.e("TRACK_RECORDING_SERVICE","Timer already null."); 
    } 
} 

を以下のメソッドを呼び出します。ここで

+0

task.cancel()に続けてtimer.purge()を実行しましたか? – Steelight

答えて

12
timer = new Timer("Message Timer"); 

あなたのオブジェクトtimerのでtimer.cancel();はTimerクラスの別のインスタンスをキャンセルさせていただきますstaticではありません。私は、以下のように、あなたはクラスの上にタイマークラスの静的インスタンス変数を作成することをお勧め

private static Timer timer; 
+0

それで簡単です。ありがとう – StuStirling

+4

私は静的なインスタンスを作成していたし、停止するつもりもありません – asiya

+0

はい静的なインスタンスも作成しましたが、停止するつもりはありません:) – bebosh

1
if(waitTimer != null) { 
    waitTimer.cancel(); 
    waitTimer.purge() 
    waitTimer = null; 
} 
0

上記の使用//

 TimerTask mTimerTask; 
    final Handler handler = new Handler(); 
    Timer t = new Timer(); 
    int nCounter = 0; 

//function for start timer 
public void doTimerTask() 
    { 

     mTimerTask = new TimerTask() 
     { 
       public void run() 
       { 
         handler.post(new Runnable() 
         { 
           public void run() 
           { 

             nCounter++:  
            //your code 
            ..... 
            ...... 

           } 
         }); 
       }}; 

      // public void schedule (TimerTask task, long delay, long period) 
      t.schedule(mTimerTask,0,50); // 

     } 

     //function for stop timer 
public void stopTimerTask(){ 

     if(mTimerTask!=null){ 

      Log.d("TIMER", "timer canceled"); 
      mTimerTask.cancel(); 
      nCounter = 0; 

    } 

}  

....この例を試してみてください開始および停止タイマーの2つの機能。 run()メソッドで

2

、操作をキャンセルタイマーがNULLの場合

private TimerTask task = new TimerTask() { 
 
@Override 
 
public void run() { 
 
if (timer == null) 
 
\t cancel(); 
 
... 
 
}

をご確認ください。

0

私はそれが遅いと知っていますが、私のプロジェクトでもこの問題が発生しました。私は私のプロジェクトでやったことは以下の通りです:

Handler handler = new Handler(); 
    Runnable runnable = new Runnable() { 
     @Override 
     public void run() { 
      //TODO Update UI 
     } 
    }; 

    public void stopTimer() { 
     if (timer != null) { 
      handler.removeCallbacks(runnable); 
      timer.cancel(); 
      timer.purge(); 
      timer = null; 
     } 
    } 

    public startTimer() { 
      timer = new Timer(); 
      timer.schedule(new TimerTask() { 
       @Override 
       public void run() { 
        handler.post(runnable); 
       } 
      }, 0, 100); 
     } 

私はremoveCallbacksで、前の回答で逃しているものと思います。

関連する問題