AsyncTaskLoader vs AsyncTask


129

Dato Honeycombe la v4 Compatibility Librarysi può utilizzare AsyncTaskLoader. Da quello che ho capito, AsyncTaskLoaderpuò sopravvivere attraverso cambiamenti di configurazione come i capovolgimenti dello schermo.

Si consiglia di utilizzare AsyncTaskLoaderanziché AsyncTask? Entra anche LoaderManagernella foto?

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

Risposte:


51

Puoi dare un'occhiata al codice sorgente della libreria di compatibilità per ottenere maggiori informazioni. Quello che FragmentActivityfa è:

  • tenere un elenco di LoaderManagers'
  • assicurati che non vengano distrutti quando capovolgi il telefono (o si verifica un'altra modifica della configurazione) salvando le istanze utilizzando onRetainNonConfigurationInstance()
  • calcia il caricatore giusto quando chiami la initLoader()tua attività

È necessario utilizzare l' LoaderManagerinterfaccia per interfacciarsi con i caricatori e fornire i callback necessari per creare i caricatori e popolare le visualizzazioni con i dati restituiti.

Generalmente dovrebbe essere più facile che gestire AsyncTaskte stesso. Tuttavia, AsyncTaskLoadernon è esattamente ben documentato, quindi dovresti studiare l'esempio nei documenti e / o modellare il tuo codice dopo CursorLoader.


5
Lo darò un'occhiata. Forse è troppo presto per trovare buoni esempi AsyncTaskLoadere, quando più sviluppatori inizieranno ad usarlo, ne arriveranno altri esempi.
OKA,

47

Quando si confronta AsyncTaskLoader e AsyncTask , come è possibile sapere quando si ruota lo schermo del dispositivo, potrebbe distruggere e ricreare l'attività, per chiarire che l'immagine può ruotare il dispositivo mentre è in corso la transazione di rete:

AsyncTask verrà nuovamente eseguito come thread in background e la precedente elaborazione del thread in background era semplicemente ridondante e zombi.

AsyncTaskLoader verrà riutilizzato basandosi sull'ID caricatore precedentemente registrato in Loader Manager, quindi evita di rieseguire la transazione di rete.

In breve, AsyncTaskLoader impedisce la duplicazione dei thread in background ed elimina la duplicazione delle attività degli zombi.


11

AsyncTaskLoader svolge la stessa funzione di AsyncTask , ma un po 'meglio. Può gestire più facilmente le modifiche alla configurazione delle attività e si comporta all'interno dei cicli di vita dei frammenti e delle attività. 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à / il frammento da gestire, AsyncTaskLoader può svolgere meglio il lavoro.

Esistono alcuni problemi con l'utilizzo di AsyncTasks:

  • Le modifiche alla configurazione possono rovinare tutto
  • La messa in pausa di un'attività non mette in pausa l'AsyncTask
  • Una discreta quantità di codice del boilerplate (che significa più possibili errori)

AsyncTaskLoader doc


8

Alcune differenze diverse da quelle descritte in altre risposte:

Quando si utilizza AsyncTaskLoader sopra AsyncTask :

  • AsyncTaskLoader ci dà la libertà di caricare vecchi dati memorizzati nella cache fino a quando non vengono restituiti nuovi datiforceLoad()

  • Possiamo impostare ritardi su AsyncTaskLoader base al setUpdateThrottle()quale è possibile impedire aggiornamenti consecutivi al client (Attività / Frammento)

  • AsyncTaskLoader può essere condiviso con più frammenti se hanno un'attività genitore comune e se è stato avviatogetActivity().getSupportLoaderManager()

  • AsyncTaskLoader viene distrutto LoaderMangerquando la sua attività collegata non è più disponibile. mentre dobbiamo distruggere manualmente AsyncTasks se la sua attività di chiamante distrugge. Questo ci fa risparmiare tempo dalla scrittura di tutte le cose di compensazione. AsyncTaskLoader gioca bene con i rispettivi cicli di vita.

Quindi, AsyncTaskLoader è molto meglio di AsyncTask.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.