2011-02-10 11 views
6

Tengo una actividad que puede tener subprocesos en ejecución cuando el usuario presiona hacia atrás y termina la actividad. ¿Qué pasa con esos hilos en ese punto? ¿Intentarán todos completar a menos que los interrumpa en Destroy()?¿Qué sucede con los hilos y vistas de una actividad cuando se destruye?

Por ejemplo, ¿es inseguro el siguiente código, porque mis vistas y el cursor se pueden destruir si la actividad finaliza antes del hilo?

La razón por la que pregunto es que tengo bloqueos ocasionales al terminar actividades que aún no he depurado con éxito, porque ocurren muy pocas veces y nunca mientras estoy en modo de depuración. Desde entonces, comencé a comprobar si mis objetos de vista son nulos antes de hacerles algo en runOnUIThread(). No estoy seguro si esa es la solución más limpia, o si ese es el problema en absoluto.

new Thread()(
public void run(){ 
    crunchOnSomethingForAwhile(mCursor); 
    MyActivity.this.runOnUIThread(new Runnable(){ 
     public void run(){ 
      mTextView.setText("thread complete"); 
      mCursor.close(); 
     } 
    } 
} 
).start(); 
+0

¿Qué dice LogCat cuando ocurren estos bloqueos? – alexanderblom

+0

Han sucedido solo cuando estaba fuera de mi computadora, por lo que no estaba conectado a LogCat. Tal vez me falta algo realmente básico, pero cuando intento descargar mi registro más tarde en la consola de Windows, solo obtengo el último par de páginas de registros en la ventana de la consola, supongo que se está quedando sin espacio. Necesito averiguar cómo volcar el archivo como un archivo en mi PC. – Tenfour04

Respuesta

1

Alguien ha publicado una respuesta en otro hilo que onDestroy establece todas las referencias de vista como nulas, y finalmente la referencia de actividad como nula. Así que supondré que es una buena práctica interrumpir todos los subprocesos en ejecución en onDestroy, o al menos capturar NullPointerExceptions en cualquier método runInUIThread.

1

me gustaría ver en el uso de AsyncTask en lugar de un simple Thread. Tiene un soporte incorporado para hacer trabajo en otro subproceso, y luego al terminar haciendo algo en el subproceso de interfaz de usuario.

Dicho esto, hay una serie de hilos en torno a esa conversación sobre cómo tratar con AsyncTask s cuando finaliza la actividad. Lo que debes hacer exactamente depende de lo que esté haciendo la tarea. Si solo es aplicable a esa Actividad, entonces puede cancelar la tarea en OnPause (asumiendo que no es solo un cambio de rotación).

De lo contrario, hay varias tácticas para aferrarse a las actividades AsyncTasks. Vea esto question para algunas ideas. Este commonsware blog también tiene un ejemplo de aferrarse a una AsyncTask en una rotación de pantalla.

+0

Gracias por la información. Estoy algo atrapado en los hilos en lugar de asynctasks, porque estoy usando el SDK de Facebook, que está escrito principalmente con hilos, y no quiero volver a escribir mucho si puedo evitarlo. No es un gran problema, pero aún no veo ningún beneficio para cambiarlo. A pesar de todo, parece que el resultado en UIThread sería similar. ¿Está manipulando una vista en una actividad destruida insegura? – Tenfour04

+0

No lo he intentado, pero parece muy probable que tratar de manipular una vista en una actividad destruida tenga consecuencias imprevistas. –

Cuestiones relacionadas