2011-08-16 10 views
5

Tengo un hilo usando el controlador y mensajes para enviar datos a la actividad. trabajo todo bien, excepto cuando se detiene la actividad:Cómo solucionar un mensaje de nulo que envía a un controlador en una advertencia de hilo muerto?

null sending message to a Handler on a dead thread 
java.lang.RuntimeException: null sending message to a Handler on a dead thread 
    at android.os.MessageQueue.enqueueMessage(MessageQueue.java:196) 
    at android.os.Looper.quit(Looper.java:173) 
    at pocket.net.ComD.stopConnection(ComD.java:154) 
    at pocket.net.ComD.finalize(ComD.java:184) 
    at dalvik.system.NativeStart.run(Native Method) 

En mi actividad, tengo el siguiente código que me permite cerrar todas las conexiones de red abierta por el hilo:

public void onPause() 
{ 
    if(this.myThread != null) { 
     this.myThread.stopConnection(); 
    } 
} 

En mi Tema:

public void run() 
{ 
    this.setName("MessagesThread"); 
    if(this.initSocket()) 
    { 

      Looper.prepare(); 
      this.threadHandler = initHandler(); 
      Looper.loop(); 
    } 
    else 
    { 
     this.timeout(); 
    } 
} 

public void stopConnection() 
{ 
    if(this.threadHandler != null) { 
     this.threadHandler.removeMessages(ALIVE); // Remove a delayed message 
     this.threadHandler.getLooper().quit(); // Warning 
    } 
    this.connected = false; 
    if(this.client != null) { 
     this.client.close(); 
    } 
} 

private Handler initHandler() 
{ 
    return new Handler() { 

     public void handleMessage(Message msg) 
     { 
      switch(msg.what) 
      { 
       //Handling messages 
      } 
     } 
    } 
} 

cuando recibo el aviso de "envío de mensajes nula a un manejador de un hilo muerto" es que la actividad tratando de enviar un mensaje al hilo o la oppposite?

¿Cómo puedo solucionar esto?

Gracias

+0

pensé que quería enviar datos desde el hilo de trabajo a la actividad (hilo de interfaz de usuario)? Si es así, ¿no debería el 'Handler' estar en la' Activity' mientras el trabajador enhebra 'sendMessage' a él? Perdón si malinterpreté tu lógica –

+0

El hilo de trabajo envía datos a la actividad de hecho. Pero la actividad pide estos datos (y otras cosas) al hilo de trabajo. Entonces ambos tienen controlador y mensajes – grunk

Respuesta

6

Usted está recibiendo el error como Looper.quit() ya ha sido llamado.

Así que la cola de mensajes es básicamente inservible después de Looper.quit() ha sido llamada la primera vez, ya que encola un mensaje con un objetivo nulo, que es el identificador mágico para la cola de mensajes para detener enqueuing y aparecen "muerto".

que tiene que hacer algo como:

private boolean stoppedFlag= false; 
public void stopConnection() 
{ 
    if(this.threadHandler != null) { 
     this.threadHandler.removeMessages(ALIVE); // Remove a delayed message 
     if(!stoppedFlag){ 
      this.threadHandler.getLooper().quit(); // Warning 
      stopFlag = true; 
     } 
    } 
    this.connected = false; 
    if(this.client != null) { 
     this.client.close(); 
    } 
} 

para detener quit() se llama varias veces

Ref Looper

Ref Looper SOQ

Cuestiones relacionadas