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.
- Ciclo de vida de la actividad de Android: orden de estado cuando se inicia una nueva actividad
- ¿Cómo comprobar si una actividad es la última en la pila de actividades de una aplicación?
- Repetición inesperada de "nombre del paquete" mientras se reanudaba en '' nombre del paquete '' Error en Android
- Android ¿Cómo volver a conectar a AsyncTask después onDestroy () y relanzar onCreate ()?
- Qué métodos se invocan en el ciclo de vida de la actividad en los siguientes casos:
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.
- ¿Los objetos de Scala sobreviven a que la actividad se reinicie en Android?
- Android mantiene el estado de devolución de llamada después del cambio de configuración
- Permitir que el diálogo se muestre antes o durante onPause ()?
- ¿Cómo probar el código construido para salvar / restaurar el ciclo de vida de una actividad?
- Cómo probar el método Activity onDestroy
- Implementación de Android de los métodos de ciclo de vida puede llamar a la aplicación de superclase después de hacer cualquier trabajo?
- Android ¿cuánto tiempo nuestra actividad estará allí en la pila
- Vida de la aplicación Android: tal vez infinita?
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:
- Inicie la aplicación
- Presiona el botón de atrás. Verá la operación de limpieza en LogCat
- Vuelva a iniciar la aplicación.
-
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.
- Cambiar entre vistas con animación de fundido cruzado
- Quitar ActionbarSherlock registra cuando BuildConfig.DEBUG