2011-08-16 13 views
5

Ho un thread che utilizza gestore e messaggi per inviare dati all'attività. funzionare tutto bene, tranne quando l'attività è in pausa:Come risolvere un messaggio di invio nullo a un gestore su un avviso di thread morto?

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) 

Nella mia attività, ho il seguente codice che mi permette di chiudere tutte le connessione di rete aperta dal filo:

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

Nella mia discussione:

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 
      } 
     } 
    } 
} 

quando ricevo l'avviso "messaggio di invio di null per un gestore su un thread morto" è che l'attività cercando di inviare un messaggio al thread o oppposite?

Come posso risolvere questo problema?

Grazie

+0

ho pensato che si voleva inviare i dati da il thread di lavoro per l'attività (thread dell'interfaccia utente)? In tal caso, il 'Handler' non dovrebbe essere nel' Activity' mentre il thread worker 'sendMessage' ad esso? Scusa se ho frainteso la tua logica –

+0

Il thread worker invia effettivamente i dati all'attività. Ma l'attività richiede questi dati (e altre cose) al thread di lavoro. Quindi entrambi hanno gestori e messaggi – grunk

risposta

6

Hai trovato l'errore come Looper.quit() è già stato chiamato.

Così la coda di messaggi è praticamente inutilizzabile dopo Looper.quit() è stato chiamato per la prima volta, come si accoda un messaggio con un target null, che è l'identificatore magico per la coda di messaggi per fermare l'accodamento e appaiono "morto".

Hai bisogno di fare qualcosa di simile:

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(); 
    } 
} 

Per interrompere uscire() di essere chiamato più volte

Ref Looper

Ref Looper SOQ

Problemi correlati