2012-02-09 19 views
5

Ho creato un'istanza Handler nel thread principale ui (mUIHandler) e da un thread worker (altro thread) quando sto provando ad eseguire il metodo run di il runnable il metodo run viene eseguito quasi 9 volte su 10 ma c'è quella volta in cui non viene eseguito.handler.post (runnable) non esegue sempre il metodo run in android

mUIHandler.post (uiRunnable) -> non garantisce sempre l'esecuzione del metodo di esecuzione presente nella eseguibile?

Ho persino aggiunto i metodi di registro per controllare e ho potuto vedere che i log fino a quando non viene eseguita l'innvocation del metodo post ma i log dei metodi di esecuzione non vengono visualizzati.

Come funziona il post (eseguibile) internamente? garantisce che il thread dell'interfaccia utente (thread con il gestore) lo escluderà appena viene richiamato il post?

Qualsiasi aiuto sarebbe apprezzato.

Grazie!

+4

Codice postale correlato all'emissione. – kosa

+1

@thinksteep proverà a esaminare il suggerimento fornito da mattc qui sotto per vedere se potrei fare qualcosa al riguardo. Sto evitando di postare lo snippet di codice qui come le sue oltre 500 linee di codice. Grazie! – Deva

risposta

6

Non ho mai visto un gestore non eseguire correttamente il runnable pubblicato. Alcuni aspetti da investigare:

  1. C'è qualche logica che potrebbe provocare una condizione di competizione tra i dati con cui il thread potrebbe interagire potenzialmente mentre il thread eseguibile in UI è in esecuzione?
  2. Hai una prova/cattura ovunque che potrebbe essere silenziosamente mangiando un'eccezione?

Il mio voto (senza aver visto il codice) è che probabilmente è il n. Non saresti la prima persona a cadere vittima di condizioni di gara difficili da tracciare a causa di una logica concorrente.

+0

Grazie Mattc per la risposta, incrocio il controllo per una possibile condizione di gara. (Spero di riuscire a localizzarlo.) Si aggiornerà. – Deva

+1

Grazie a @Mattc era la condizione di gara che lo stava facendo. Per fortuna è stato in grado di trovare la causa. Effettivamente un buon apprendimento. – Deva

+0

Felice di averlo trovato. La logica del thread è notoriamente pignola e difficile da eseguire il debug. – MattC

10

Ho avuto questo problema anche su Android 2.2, nel mio caso sia Runnables che Messaggi venivano usati con lo stesso Handler.

Dopo aver esaminato il codice sorgente dell'handler, risulta che la rimozione dei messaggi con un valore "what" di 0 rimuove anche tutti i Runnable in coda. Ciò accade perché nella classe Handler un Runnable è internamente pubblicato come un messaggio con un valore "what" pari a zero, che vengono tutti rimossi da qualsiasi chiamata a removeMessages(0). Pertanto, evitare di utilizzare zero come ID messaggio.

+0

Se solo ci potrebbero essere due risposte preferite. Non ho idea di quanto tempo mi hai salvato con questa risposta, ma è un sacco di tempo! –

Problemi correlati