Java.lang.IllegalStateException: TimerTask ya está programado: Uso racional de Timer y TimerTask en Android

Escribo una aplicación que se conecta al servidor y le envía comandos ping , respuesta del servidor con los comandos pong .

Quiero implementar mecanismo de tiempo de espera de conexión. Creo que va a seguir:

  • Cliente enviar ping y iniciar temporizador con timertask y retardo
  • Cuando el cliente recibe pong , timertask se cancela.

Además, quiero optimizar la memoria. Por lo tanto, no para recrear TimerTask cada vez que envío comando ping . Intento código abajo:

private final Timer mSystemLogoutTimer = new Timer(); private final TimerTask mLogoutTask = new TimerTask() { @Override public void run() { mMessageInterface.onConnectionTimeout(); cancel(); } }; private void ping() { sendRequest(RequestBuilder.formPing()); mSystemLogoutTimer.schedule(mLogoutTask, CoreConst.PING_ANSWER_DELAY); } private void onPong() { mLogoutTask.cancel(); } 

Pero consigo el siguiente error cuando intento programar TimerTask segunda vez:

 java.lang.IllegalStateException: TimerTask is scheduled already at java.util.Timer.scheduleImpl(Timer.java:572) at java.util.Timer.schedule(Timer.java:459) 

No entiendo, porque llamo cancel() en TimerTask.

Por favor, dime lo que estoy haciendo mal. Gracias por las respuestas!

TimerTask.cancel() no impide necesariamente la ejecución de la tarea. De acuerdo con la documentación de SDK , devuelve true cuando la ejecución se evitó realmente, false contrario.

Parece que esto es lo que ocurre con su código como la primera vez que se devuelve true , pero no el segundo, lo que lleva a una IllegalStateException a ser lanzado al llamar a Timer.schedule() justo después.

Debe comprobar el código de retorno de TimerTask.cancel() y volver a crear TimerTask cuando se devuelve false : TimerTask se quema y no se puede volver a utilizar en ese momento.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.