È un'ottima domanda, ci vuole tempo come programmatore Android per comprendere appieno il problema. Infatti AsyncTask ha due problemi principali correlati:
- Sono scarsamente legati al ciclo di vita dell'attività
- Creano perdite di memoria molto facilmente.
All'interno dell'app RoboSpice Motivations ( disponibile su Google Play ) rispondiamo in dettaglio a questa domanda. Fornirà una visione approfondita di AsyncTask, Loader, le loro caratteristiche e svantaggi e ti introdurrà anche a una soluzione alternativa per le richieste di rete: RoboSpice. Le richieste di rete sono un requisito comune in Android e sono per natura operazioni di lunga durata. Ecco un estratto dall'app:
Il ciclo di vita AsyncTask e Activity
Gli AsyncTask non seguono il ciclo di vita delle istanze di Activity. Se avvii un AsyncTask all'interno di un'attività e ruoti il dispositivo, l'attività verrà distrutta e verrà creata una nuova istanza. Ma AsyncTask non morirà. Continuerà a vivere finché non sarà completo.
E al termine, AsyncTask non aggiornerà l'interfaccia utente della nuova attività. Infatti aggiorna l'istanza precedente dell'attività che non viene più visualizzata. Ciò può portare a un'eccezione del tipo java.lang.IllegalArgumentException: vista non allegata al gestore delle finestre se si utilizza, ad esempio, findViewById per recuperare una vista all'interno dell'attività.
Problema di perdita di memoria
È molto comodo creare AsyncTask come classi interne delle tue attività. Poiché AsyncTask dovrà manipolare le visualizzazioni dell'attività quando l'attività è completa o in corso, l'uso di una classe interna dell'attività sembra conveniente: le classi interne possono accedere direttamente a qualsiasi campo della classe esterna.
Tuttavia, significa che la classe interna manterrà un riferimento invisibile sulla sua istanza di classe esterna: l'attività.
A lungo andare, questo produce una perdita di memoria: se l'AsyncTask dura a lungo, mantiene "viva" l'attività mentre Android vorrebbe sbarazzarsene in quanto non può più essere visualizzato. L'attività non può essere raccolta dai rifiuti e questo è un meccanismo centrale per Android per preservare le risorse sul dispositivo.
È davvero una pessima idea usare AsyncTasks per operazioni di lunga durata. Tuttavia, vanno bene per quelli di breve durata come l'aggiornamento di una vista dopo 1 o 2 secondi.
Ti incoraggio a scaricare l' app RoboSpice Motivations , lo spiega davvero in modo approfondito e fornisce esempi e dimostrazioni dei diversi modi per eseguire alcune operazioni in background.
doInBackground
blocca lo schermo se non viene utilizzata una barra di avanzamento.