Si consideri il seguente frammento di codice:Cosa succede se un gestore invia un messaggio a un thread dopo Looper.prepare() ma prima che Looper.loop() sia stato chiamato?
Looper.prepare();
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
getLooper().quitSafely();
}
};
for(int i = 0; i < urls.size(); i++) {
useCaseProvider.get().execute(callback, handler, urls.get(i), threadPool);
}
Looper.loop();
//Continue processing the results of all the use cases after the
//loop has been asked to terminated via the handler
Un po 'di storia: sto facendo un po' di elaborazione sul thread dell'interfaccia utente in cui ho bisogno di eseguire il ping un grande su di dispositivi e fare qualcosa con il risultato. Ho bisogno di eseguire le richieste in parallelo per essere efficiente.
Domanda: se uno di questi casi d'uso è stato eseguito in qualche modo abbastanza veloce e ha fatto una richiamata prima che potessi colpire Looper.loop(); il messaggio verrebbe accodato o semplicemente perso? I callback vengono postati su questo thread dal gestore che esegue una eseguibile sul thread originale.
Quindi, fondamentalmente nel suo snippet i messaggi di elaborazione sul 'MessageQueue' saranno ritardati dal tempo di esecuzione del ciclo' for'. – Emmanuel
Praticamente. Qualsiasi tentativo di consegna a un Looper non inizializzato comporterà un'eccezione di runtime. A seconda di cosa è necessario, un IntentService potrebbe essere un modo migliore per andare. – jagsaund