0

キープアライブを受け取ったときにタイマーを再起動したいのですが、問題は、新しいタイマーを作成するのではなく、再起動しないことがあるため、最終的にタイマーが制限に達することです:

public class KeepAliveTimer {


long macAddress;
Timer timer;
String ip;  


public KeepAliveTimer(long mac, String ipAddress){
    this.macAddress = mac;
    this.ip = ipAddress;

    timer = new Timer();

    TimerTask timerTask = new TimerTask() {

        @Override
        public void run() {

            timerFinished();

        }
    };

    timer.schedule(timerTask, 10*60*1000);
}


public void update() {


    TimerTask timerTask = new TimerTask() {

        @Override
        public void run() {
            timerFinished();

        }
    };
    timer.cancel();
    timer.purge();
    timer = new Timer();
    timer.schedule(timerTask, 10*60*1000);
}

public void timerFinished() {

    //tasks
}

}

オブジェクト KeepAliveTimer は、最初の keepAlive を受信したときに作成され、次のキープアライブによって更新されます

4

1 に答える 1

1

タイマー全体をキャンセルするのではなく、TimerTask. これは私があなたのコードを書く方法です:

public class KeepAliveTimer {
  final Timer timer = new Timer();
  final long macAddress;
  final String ip;
  volatile TimerTask timerTask;

  public KeepAliveTimer(long mac, String ipAddress) {
    this.macAddress = mac;
    this.ip = ipAddress;
  }
  public void update() {
    if (timerTask != null) timerTask.cancel();
    timer.schedule(timerTask(), 10 * 60 * 1000);
  }
  private TimerTask timerTask() {
    return timerTask = new TimerTask() {
      @Override public void run() { timerFinished(); }
    };
  }
  public void timerFinished() {
    // tasks
  }
}

コンストラクター内でスケジューリングを複製しないことに注意してください。で初期化する必要があります

new KeepAliveTimer(mac, ip).update();
于 2012-10-30T12:40:35.740 に答える