Realizando operaciones de larga duración en onDestroy

Tengo una operación de limpieza "larga" que necesito realizar en onDestroy() de mi Activity . ¿Cuál es la mejor manera de hacer esto?

Si utilizo un Thread para hacer esto, mi onDestroy() volverá inmediatamente; Pero ¿qué sucede con la referencia de hilo? Estoy buscando consejo en cualquier implicaciones / gotchas / viaje-alambres que necesito estar enterado aquí desde que asumo que el proceso todavía estará vivo incluso después de que la actividad sea destruida.


Fondo:

Estoy usando JmDNS en mi aplicación. Cuando el usuario ha terminado con mi aplicación, quiero limpiar la instancia de JmDNS. Lo hago usando el método close() de la clase JmDNS . Sin embargo, este método tarda más de 5 segundos en completarse. Como resultado, el usuario ve mi Activity en pantalla durante mucho tiempo después de tocar la tecla Atrás.

Todavía estoy por averiguar por qué el close() tarda tanto tiempo, pero en el entretanto también me di cuenta de que realmente no es necesario esperar a que el cierre para completar con éxito. Todo lo que necesito es una manera de "desencadenar" el cierre y de ser hecho con él.

Terminé haciendo lo que había preguntado en la pregunta – comienzo un Thread para realizar la operación de larga duración en onDestroy() .

Un caso que tuve que considerar fue cuando el usuario vuelve a abrir mi aplicación, incluso antes de que el largo plazo se ha completado. En mi aplicación, esto significa que una nueva instancia de JmDNS se crea. Por lo tanto, limpiar cada caso por separado en mi onDestroy .

Su caso de uso podría diferir – puede ser que desee iniciar el hilo de limpieza sólo si no se está ejecutando (utilizando el método isAlive() Thread o alguna otra técnica).

He aquí un ejemplo de código. Para apreciar la parte "limpiar cada instancia por separado", realice la siguiente secuencia de pasos:

  1. Inicie la aplicación
  2. Presiona el botón de atrás. Verá la operación de limpieza en LogCat
  3. Vuelva a iniciar la aplicación.
  4. De nuevo, salga de la aplicación. Ahora, verá dos conjuntos de registros de limpieza: el primero que representa la limpieza para la primera instancia; Y el segundo conjunto correspondiente a la segunda instancia.

     public class DelayedExitActivity extends Activity { private static final String LOG_TAG = "DelayedExit"; private final Runnable longOperation = new Runnable(){ @Override public void run() { for (int i=0 ; i < 50; i++){ Log.d(LOG_TAG, "Iteration "+i); try { Thread.sleep(2 * 1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }; private Thread longThread ; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override protected void onDestroy() { if(longThread == null){ longThread = new Thread(longOperation); } longThread.start(); super.onDestroy(); } } 

Intente iniciar su subproceso en onBackPressed() y llame a destroy() cuando el hilo termine.

  • Método de clase de aplicación Android onCreate que se llama varias veces
  • OnSaveInstanceState / onPause - espera hasta que el estado se salve por completo antes de permitir que se procese el proceso
  • ¿Cómo funcionan los ciclos de vida de la actividad de Android en relación con la aplicación completa?
  • Ciclo de vida de la actividad de Android después de salir del sueño
  • Android - Tiempo de vida de las diferentes opciones de almacenamiento
  • Ciclo de vida de la actividad lado a lado
  • La aplicación se comporta diferente después de salir y volver a entrar
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.