2011-02-18 15 views
19

Tengo una duda .. Estoy teniendo una carrera en una actividad en mi aplicación. Aunque mi actividad destruyó el controlador que aún funcionaba. ¿Se ejecuta en un proceso diferente al proceso de solicitud? ¿Podría alguien explicar por qué funciona así? ¿Es posible detener el controlador mientras está en Destrucción de la actividad?Cómo detener el controlador?

Gracias de antemano.

+0

Sería útil si proporcionó detalles del controlador, incluso mejor si publicó el código. Además, ¿crea una instancia del controlador en un hilo diferente? – basilisk

Respuesta

1

¿quiere decir que tiene un hilo en algún lugar de su actividad? detener un hilo es bastante fácil, necesita tener una referencia para ese hilo. como:

private Thread mMyThread; 
mMyThread = new Thread ....... 

y cuando se desea detenerlo, simplemente comprobar si la referencia no es nulo y llamar al método de interrupción:

if (mMyThread != null) { 
    mMyThread.interrupt(); 
} 

esperan que ayude a

+0

gracias ... ayudó mucho ... – Taruni

25

Como se describe en el documentación

http://developer.android.com/reference/android/os/Handler.html

"Cada instancia Handler está asociado con un solo hilo y la cola de mensajes de ese hilo ".

Cuando esté a punto de finalizar su actividad, p. en onDestroy() también es necesario para cancelar la llamada de retorno para el ejecutable que se inició para:

mHandler.removeCallbacks(previouslyStartedRunnable); 

Usted puede hacer que incluso sin comprobar si es ejecutable ya fue despedido, mientras que su actividad era activo.

ACTUALIZACIÓN:

Hay dos casos adicionales a considerar:

1.) Ha implementado su Gestor de manera que ha creado la nueva clase para el ejecutable, por ejemplo,

private class HandleUpdateInd implements Runnable... 

Por lo general, que tiene que hacer que si usted tiene que comenzar con retraso ejecutable conjunto actual de parámetros (que pueden cambiar hasta que arranque ejecutables). Para cancelarlo es necesario utilizar

mHandler.removeCallbacksAndMessages(HandleUpdateInd.class); 

2.) Si está utilizando la llamada línea (JPM gracias por el comentario)

handler = new Handler() { public void handleMessage(Message msg) { ... } }; 

Luego hay que definir "qué" valor para ese mensaje. Más adelante, si necesita cancelarlo, puede usar

handler.removeMessages(what); 

para realizar esa tarea.

+1

¿cómo se hace esto si es una llamada en línea en su onCreate de una actividad? es decir, handler = new Handler() {public void handleMessage (Message msg) {...}}; – JPM

+0

Al enviar el mensaje, debe definir el valor "qué". Luego, puede consultarlo y solicitar handler.removeMessages (what); – Zelimir

0

Me gusta la respuesta de Zelimir, solo algo más de información al respecto: Android no define límites para la vida de la aplicación, la aplicación se crea al primer inicio y puede permanecer activa entre varios ciclos de Actividades en Creación/onDestrucción. Los manipuladores están asociados con la secuencia/cola del único evento principal de la aplicación, por lo que una actividad no puede "detenerlo" (aunque es probable que pueda hacerlo a través de Handler.getLooper(). Quit(), pero no estoy seguro de si ganó ". Puede causar problemas. También podría eliminar toda la aplicación como se describe aquí here).

Probablemente el concepto de Android es reutilizar las instancias de aplicaciones tanto como sea posible, por lo que su principal preocupación al desarrollar una actividad es la autorización adecuada de los recursos de la actividad en la llamada onDestroy. Las variables estáticas, subprocesos, AsyncTasks y mensajes/devoluciones de llamadas en los controladores son los elementos de los que preocuparse.