2012-05-21 11 views
10

Considerare un AsyncTask avviato in un'attività. Cosa succede se l'attività viene messa in pausa o distrutta? Eseguirà onPostExecute()? Se sì, quale thread UI verrà utilizzato?Che cosa significa "gira su thread UI" per onPostExecute() significa veramente?

Solo chiedendo.

Molte grazie in anticipo.

+0

'onPostExcecute' verrà eseguito ma genererà un'eccezione per cercare di eseguire su un thread morto se la tua attività viene distrutta. Se hai un AsyncTask in esecuzione quando la tua attività potrebbe essere spenta, considera di spostare il tuo codice su un servizio o usando un loader. – Jave

+0

in caso di attività distrutta: verrà arrestato in modo anomalo perché ha perso il riferimento con l'attività di origine. Incase Activity in pausa, viene comunque eseguito su tale attività. Per questo scenario: dovresti usare il servizio intent e ottenere risultati via Broadcast. –

risposta

10

Il thread dell'interfaccia utente è disponibile per tutta la durata visibile dell'applicazione, che può comprendere una combinazione di più attività.

Tutto ciò che si cambia in vista deve essere effettuata sui thread dell'interfaccia utente e OnPostExecute di AsyncTask riflette la stessa logica eseguendo le istruzioni all'interno sul thread dell'interfaccia utente.

È possibile utilizzare runOnUiThread nel proprio Thread per apportare modifiche alle Visualizzazioni. Ma poiché AsyncTask ha il metodo onPostExecute (che viene eseguito anche sul thread dell'interfaccia utente), quindi non è logicamente necessario utilizzare runOnUiThread.


Aggiornamento

quanto riguarda la tua domanda: Sì, OnPostExecute sarà ancora chiamato (perché la sua invocato da un thread separato), anche se la vostra attività è distrutto e se il metodo di manipolare Visualizzazioni, Otterrai semplicemente l'errore Forza Chiudi perché il riferimento alla tua attività non è più disponibile.

+2

la sua domanda è diversa, per favore leggila di nuovo – Akram

0

Ricordarsi di chiamare la funzione di annullamento per essere nulli in onPause o onDestroyed.

+0

Grazie per la tua risposta. La risposta di Wagas insieme al tuo suggerimento mi darà un'idea di come migliorare ulteriormente il mio attuale design. –

1

Si bloccherà nel onPostExecute() a causa del thread dell'interfaccia utente come una finestra di dialogo del processo. Succede a me, la mia attività distrugge prima che il mio Asynctask sia completato. Dice "finestra trapelata ....." Quindi, rimuovo onPostExecute(). Niente più crash ..

Problemi correlati