web-dev-qa-db-ja.com

Android-TimerとTimerTaskでタスクを制御しますか?

現在、Android 30秒ごとにWiFiアクセスポイントをスキャンするアプリケーションでWiFiスキャンを設定しようとしています。

TimerとTimerTaskを使用して、必要な間隔でスキャンを正しく実行しました。

ただし、ユーザーがボタンを押したときにスキャンを停止および開始できるようにしたいのですが、現在、TimerとTimerTaskを停止して再起動するのに問題があります。

ここに私のコードがあります

TimerTask scanTask;
final Handler handler = new Handler();
Timer t = new Timer();

public void doWifiScan(){

scanTask = new TimerTask() {
        public void run() {
                handler.post(new Runnable() {
                        public void run() {
                         wifiManager.scan(context); 
                         Log.d("TIMER", "Timer set off");
                        }
               });
        }};


    t.schedule(scanTask, 300, 30000); 

 }

  public void stopScan(){

   if(scanTask!=null){
      Log.d("TIMER", "timer canceled");
      scanTask.cancel();
 }

}

したがって、タイマーとタスクは正常に開始され、スキャンは30秒ごとに発生しますが、停止させることはできません。タイマーを停止できますが、タスクは引き続き発生し、scanTask.cancel()も機能していないようです。

これを行うためのより良い方法はありますか?または、Timer/TimerTaskクラスに何か不足していますか?

37
Donal Rafferty

あなたが考慮するかもしれない:

  • タスクでcancel()を呼び出した結果のブール値を調べます。リクエストが成功したか失敗したかを示す必要があります。
  • Timerの代わりにTimerTaskpurge()またはcancel()を試してください。

必ずしもTimerおよびTimerTaskが必要でない場合は、常にpostDelayed()(ハンドラーおよび任意のViewで使用可能)を使用できます。これにより、Runnableが遅延後にUIスレッドで実行されるようにスケジュールされます。繰り返して実行するには、定期的な作業を行った後、再度スケジュールを設定してください。その後、このプロセスをいつ終了するかを示すブールフラグを監視できます。例えば:

private Runnable onEverySecond=new Runnable() {
    public void run() {
        // do real work here

        if (!isPaused) {
            someLikelyWidget.postDelayed(onEverySecond, 1000);
        }
    }
};
27
CommonsWare

代わりにコードを使用する

scanTask.cancel();

正しい方法は、タイマーをキャンセルすることです(timerTaskではありません):

t.cancel();
6
tony gil

Androidのドキュメントでは、cancel()はタイマーとすべてのスケジュールされたタスクをキャンセルします。現在実行中のタスクがある場合、影響を受けません。このタイマーでタスクをスケジュールすることはできません。何も問題ありません。

5
Mike