2013-05-12 32 views
14

Per quello che ho capito, il framework Loader è orientato all'accesso ai dati memorizzati localmente in un database ContentProvider/SQLite. Abbiamo la classe CursorLoader che gestisce questo caso d'uso abbastanza bene.I caricatori devono essere utilizzati per accedere ai servizi Web?

Ma mi chiedo se è pratico utilizzare il framework Loader di scrivere classi estendono Loader/AsyncTaskLoader per accedere a servizi Web remoti (ad esempio, un servizio web REST)? Ho sempre pensato che questa struttura fosse un po 'troppo rigida e confusa (mancanza di una documentazione adeguata) per questo caso d'uso. Preferisco gestire le chiamate REST in modo più regolare, utilizzando AsyncTasks/Services. Ma recentemente ho trovato alcuni articoli che hanno usato AsyncTaskLoaders e hanno iniziato a meravigliarsi.

Quindi, perché qualcuno dovrebbe utilizzare i caricatori per accedere ai servizi Web? L'unico vantaggio che vedo qui è che i caricatori mantengono automaticamente i loro risultati. Non c'è Cursore qui da gestire in seguito.

+0

Puoi condividere il tutorial a cui ti riferivi? –

+0

Ecco qui: http://neilgoodman.net/2011/12/26/modern-techniques-for-implementing-rest-clients-on-android-4-0-and-below-part-1/ –

risposta

11

Realisticamente, probabilmente si desidera utilizzare una libreria di rete come Volley. Questo ha alcune caratteristiche interessanti come il batching delle richieste e la cache delle immagini. Nondimeno, per il gusto di argomento permette di confrontare Service, Loader se AsyncTask.

I servizi sono la strada da percorrere se si desidera consentire al caricamento di continuare mentre si modificano le attività o lo sfondo dell'applicazione. Oppure, se vuoi esportare il tuo servizio in modo che più applicazioni possano usarlo. Altrimenti, utilizzare un Loader o AsyncTaskLoader.

I caricatori hanno alcuni vantaggi rispetto a AsyncTasks.

  • È meno probabile che causino arresti anomali eseguendo codice al termine dell'attività, poiché sono a conoscenza del ciclo di vita di Android.
  • Il progetto sconsiglia di fare riferimento a View s o Attività. Ciò riduce la probabilità di forzare l'attività a rimanere in memoria dopo che è già terminata.
  • Monitorare l'origine dati per le modifiche e attivare i callback quando si verificano
  • Hanno incorporato il caching che può essere utile dopo le rotazioni. Per Cursor s, il CursorLoader ricollega automaticamente nella posizione corretta all'ultimo cursore caricato

Tuttavia, essi hanno anche svantaggi

  • L'API è estremamente più ingombrante di AsyncTask. Soprattutto se ti interessa la compatibilità con le versioni precedenti di Android
  • Stai già memorizzando lo stato dell'interfaccia utente all'interno di onSaveInstanceState(), quindi l'utilizzo dello Loader consente di salvare lo stato in diversi modi. Questo può essere fonte di confusione da leggere e capire. Soprattutto se finisci per mescolare frammenti trattenuti nel mix.
  • Il Loader memorizza nella cache il risultato caricato, non lo stato di interfaccia utente che è effettivamente necessario

Sto assumendo si sta solo leggendo dai servizi web, non scrivere. Se si stanno eseguendo aggiornamenti a un servizio Web e è necessario vedere la risposta del servizio, questo cambia le cose. L'utilizzo di AsyncTask potrebbe impedire di ottenere la risposta se viene ricevuta durante una rotazione.

2

In alcuni casi, Loader è adatto per i servizi Web: quando il server può inviare le notifiche push al per notificare che i dati sono stati modificati.

Problemi correlati