2

現在、Timer と TimerTask を使用して、30 秒ごとにいくつかの作業を実行しています。

私の問題は、この作業を行うたびに、タイマーの間隔時間を増やしたいということです。

たとえば、タイマーの発火の間に 30 秒で開始しますが、次にタイマーが発火するまでに 40 秒かかるように、間隔に 10 秒を追加したいと考えています。

これが私の以前のコードです:


  public void StartScanning() {

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

                            wifiManager.startScan();
                            scanCount++;            
                            if(SCAN_INTERVAL_TIME <= SCAN_MAX_INTERVAL){

                                SCAN_INTERVAL_TIME = SCAN_INTERVAL_TIME + SCAN_INCREASE_INTERVAL;
                                t.schedule(scanTask, 0, SCAN_INTERVAL_TIME);
                            }

                        }
               });
        }};
        Log.d("SCAN_INTERVAL_TIME ** ", "SCAN_INTERVAL_TIME ** = " + SCAN_INTERVAL_TIME);
        t.schedule(scanTask, 0, SCAN_INTERVAL_TIME);

}

リファクタリングされたコード


@Override
public void StartScanning() {

        t.schedule(new ScanTask(),SCAN_INTERVAL_TIME);

}

class ScanTask extends TimerTask{

    @Override
    public void run() {
        wifiManager.startScan();
        scanCount++;   

        if(SCAN_INTERVAL_TIME < SCAN_MAX_INTERVAL)
        SCAN_INTERVAL_TIME = SCAN_INTERVAL_TIME + SCAN_INCREASE_INTERVAL;

        t.schedule(new ScanTask(), SCAN_INTERVAL_TIME);
    }


}

現在は機能していますが、無駄なたびに新しい ScanTask() を作成していますか?

4

1 に答える 1

4

これが私がそれを行う方法です:

1) タスクを繰り返し実行するのではなく、 1 回実行するようにスケジュールする

2) 実行の最後 (おそらく finally ブロック内) で、タスクの新しい単一の実行をより長い遅延でスケジュールします。タスクの新しいインスタンスを作成する必要があることに注意してください。そうしないと、タイマーが文句を言います (IllegalStateException)。これは、匿名の内部クラスを使用できなくなったことを意味します。

于 2010-05-26T11:23:48.110 に答える