現在、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クラスに何か不足していますか?
あなたが考慮するかもしれない:
cancel()
を呼び出した結果のブール値を調べます。リクエストが成功したか失敗したかを示す必要があります。Timer
の代わりにTimerTask
でpurge()
または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);
}
}
};
代わりにコードを使用する
scanTask.cancel();
正しい方法は、タイマーをキャンセルすることです(timerTaskではありません):
t.cancel();
Androidのドキュメントでは、cancel()はタイマーとすべてのスケジュールされたタスクをキャンセルします。現在実行中のタスクがある場合、影響を受けません。このタイマーでタスクをスケジュールすることはできません。何も問題ありません。