13

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

停止に関しては、タイマーはすでに null です。

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

以下のコードは、記録の停止に関してタイマーがすでに null になっている例です。

タイマータスク

MyTimerTaskはクラス内で初期化されますが、メソッドと以下のコードの外で...

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.");
     }
 }

どんな助けでも大歓迎です。

4

8 に答える 8

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

ここでは、オブジェクトtimerはそうではないstaticのでtimer.cancel();、Timerクラスの別のインスタンスをキャンセルします。以下のように、クラスの先頭にタイマークラスの静的インスタンス変数を作成することをお勧めします。

private static Timer timer;
于 2012-07-16T10:49:01.460 に答える
3

run() メソッドで、タイマーが null かどうかを確認してから、

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

操作をキャンセルします。

于 2014-12-21T14:37:23.397 に答える
1

遅いことはわかっていますが、私のプロジェクトでもこの問題に遭遇しました。私の解決策が人々にいくつかのアイデアを与えることを願っています. 私のプロジェクトで行ったことは以下のとおりです。

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だと思います。

于 2015-12-14T05:23:49.823 に答える
1
if(waitTimer != null) {
   waitTimer.cancel();
   waitTimer.purge()
   waitTimer = null;
}
于 2012-07-16T10:57:04.950 に答える
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 つの関数をタイマーの開始と停止に使用します。

于 2012-07-16T12:12:06.850 に答える