2011-08-19 14 views
116

Dal Honeycomb e v4 Compatibility Library è possibile utilizzare AsyncTaskLoader. Da quello che ho capito, lo AsyncTaskLoader può sopravvivere attraverso modifiche di configurazione come i salti mortali.AsyncTaskLoader vs AsyncTask

Si consiglia di utilizzare AsyncTaskLoader anziché AsyncTask? LoaderManager entra anche tu nella foto?

Ma non ho trovato alcun buon esempio su come utilizzare correttamente lo AsyncTaskLoader. I documenti inoltre non forniscono esempi. Qualcuno può fornire alcuni buoni esempi.

risposta

47

È possibile dare un'occhiata al codice sorgente della libreria di compatibilità per ottenere maggiori informazioni. Che FragmentActivity fa è:

  • tenere un elenco di LoaderManager s'
  • assicurarsi che non vengano distrutte quando si schiaccia il telefono (o si verifica un altro cambiamento di configurazione) da istanze risparmio utilizzando onRetainNonConfigurationInstance()
  • calciare il caricatore di destra quando si chiama initLoader() nella vostra attività

È necessario utilizzare il LoaderManager per interfacciarsi con i caricatori, e fornire i callback necessarie per creare il loader (s) e po cancellare le tue opinioni con i dati che restituiscono.

Generalmente dovrebbe essere più semplice della gestione di AsyncTask. Tuttavia, AsyncTaskLoader non è esattamente ben documentato, quindi dovresti studiare l'esempio nei documenti e/o modellare il tuo codice dopo CursorLoader.

+5

Darei un'occhiata a questo. Forse è troppo presto per trovare buoni esempi su 'AsyncTaskLoader', e quando altri sviluppatori iniziano a usarlo, altri esempi arriveranno. – OKA

8

AsyncTaskLoader esegue la stessa funzione del AsyncTask, ma un po 'meglio. Può gestire le modifiche alla configurazione delle attività più facilmente e si comporta nei cicli di vita di Fragments and Activities. La cosa bella è che AsyncTaskLoader può essere utilizzato in qualsiasi situazione in cui viene utilizzato AsyncTask. Ogni volta che i dati devono essere caricati in memoria per l'attività/frammento da gestire, AsyncTaskLoader può fare meglio il lavoro.

Ci sono alcuni problemi con l'utilizzo di AsyncTasks, però:

  • modifiche di configurazione possono complicare le cose
  • Messa in pausa di un'attività non mettere in pausa l'AsyncTask
  • una discreta quantità di codice standard (che mezzi più errori possibili)

AsyncTaskLoader doc

27

Quando si confronta AsyncTaskLoader rispetto a AsyncTask, come forse sapete quando si ruota lo schermo del dispositivo, si può distruggere e ricreare l'attività, per rendere più chiaro l'immagine ruotare il dispositivo mentre è in corso la transazione di rete:

AsyncTask verrà eseguito nuovamente come thread in background e l'elaborazione precedente del thread in background è stata semplicemente ridondante e zombie.

AsyncTaskLoader sarà appena ri-utilizzato basando on Loader ID che ha registrato nel Loader Manager prima, in modo da evitare ri-esecuzione delle transazioni di rete.

In sintesi, AsyncTaskLoader impedisce la duplicazione di thread in background ed elimina la duplicazione di attività zombie.

+0

dovrebbe essere la risposta giusta –

0

Alcune differenze diversi da quelli descritti in altre risposte:

Quando si utilizza AsyncTaskLoader oltre AsyncTask:

  • AsyncTaskLoader ci dà la libertà di caricare i vecchi dati memorizzati nella cache fino a quando viene restituito nuovi dati di forceLoad()

  • Possiamo impostare ritardi AsyncTaskLoader di setUpdateThrottle() che possono impedire gli aggiornamenti consecutivi al cliente (Attività/Frammento)

  • AsyncTaskLoader possono essere condivise a più frammenti se hanno un'attività genitore comune e se è stato avviato da getActivity().getSupportLoaderManager()

  • AsyncTaskLoader viene distrutto da LoaderManger quando l'attività collegata non è più disponibile. mentre abbiamo bisogno di distruggere manualmente AsyncTasks se la sua attività del chiamante distrugge. Questo risparmia il nostro tempo dalla scrittura di tutte le cose di compensazione. AsyncTaskLoader funziona bene con i rispettivi cicli di vita.

Quindi, AsyncTaskLoader è decisamente migliore di AsyncTask.