11

In un'app Android, devo inviare più richieste GET a un URL per trasmettere dati a un server esterno (è così che funziona l'API di terze parti).Il modo migliore per inviare richieste HTTP GET in modo asincrono in Android?

I dati arrivano sporadicamente. Conservo questi dati in una coda e desidero inviarli al server in uno sfondo in modo asincrono senza rallentare il thread dell'interfaccia utente principale. Ogni unità di dati nella coda richiede una richiesta GET. La coda deve essere svuotata anche se l'app si chiude.

Qual è la procedura migliore per farlo? Si prega di inviare/indirizzarmi al codice/tutorial.

risposta

27

Qual è la migliore pratica per fare questo?

Ciò dipenderebbe da cosa "questo" è e da dove viene svolto questo lavoro.

Se "questo" è "lavoro asincrono", si utilizzerà le discussioni in una forma o di moda:

  • Se le operazioni HTTP stanno guidando un'interfaccia utente, è possibile utilizzare AsyncTask, in modo da poter aggiornare il UI in modo sicuro da onPostExecute()

  • Se le operazioni HTTP sono puramente in background, e si vuole fare uno alla volta, utilizzare un IntentService, che ha il suo thread in background e coda di lavoro

  • Se le operazioni HTTP sono puramente in background, e si vuole fare uno alla volta, e si sono preoccupati per far sì che il dispositivo dovrebbe stare sveglio mentre tutto questo sta succedendo, prendere in considerazione il mio WakefulIntentService

  • Se la vostra Le operazioni HTTP sono solo sullo sfondo, ma ritieni di volerle diverse alla volta, tira il tuo Service che usa uno Executor con il tuo pool di thread, assicurandoti di spegnere quel servizio quando il lavoro è terminato (come IntentService fa) e assicurandosi che il dispositivo sia attivo con un (e forse uno WifiLock)

  • Ecc.

Se "questo" è "HTTP GET" richieste, l'uso:

  • HttpUrlConnection, o

  • HttpClient, o

  • OkHttp (wrapper per quelli con aggiunta benefici), oppure

  • Retrofit (se le vostre richieste GET sono davvero chiamate al servizio Web), o

  • Volley (se vi piace il codice wrapper HTTP ad essere privi di documenti, non supportato, ma fuori orbita)

  • qualsiasi numero di altre terze parti biblioteche involucro

Se "questo" è "coda", utilizzare la classe Queue, o LinkedBlockingQueue se si pensa di avere più thread lavorano con esso in una sola volta.

Se "questo" è qualcos'altro, non posso aiutarti, dato che sono stanco di indovinare.

+1

+1 per il commento di Volley. ;-) –

+0

Nota: Volley è ora consigliata come best practice, supportata, documentata e non si applica solo alle richieste GET. – Nilzor

+0

@Nilzor: "best practice raccomandate": fornire collegamenti alle pagine su http://developer.android.com che indicano questo. "supportato, documentato" - si prega di fornire collegamenti ad alcuni siti (ad esempio, GitHub repo) in cui il supporto è in corso e la documentazione risiede. "non si applica solo alle richieste GET" - Non ho mai detto che era * solo * per le richieste 'GET'. La * domanda * riguarda le richieste 'GET'. – CommonsWare

8

È possibile eseguire le proprie chiamate HTTP GET asincrone utilizzando AsyncTask ma si consiglia di farlo a meno che non lo si stia facendo da un punto di vista dell'apprendimento. Se vuoi una soluzione bella, pulita e stabile ti suggerisco di utilizzare la nota libreria di terze parti Android Asynchronous Http Client. Dal sito:

"Un client Http asincrono basato su callback per Android basato sulle librerie HttpClient di Apache. Tutte le richieste vengono eseguite al di fuori del thread principale dell'interfaccia utente dell'applicazione, ma qualsiasi logica di callback verrà eseguita sullo stesso thread di il callback è stato creato utilizzando il passaggio del messaggio Handler di Android. "

Making a ottenere è facile come:

AsyncHttpClient client = new AsyncHttpClient(); 
client.get("http://www.google.com", new AsyncHttpResponseHandler() { 
    @Override 
    public void onSuccess(String response) { 
     System.out.println(response); 
    } 
}); 
+0

Cosa succede se l'app si chiude? – ask

+0

Penso che la richiesta async corrente finirà, ma in realtà non sono sicuro. – britzl

+0

Biblioteca dall'aspetto gradevole. Gona provalo nel mio nuovo progetto. Grazie – speedynomads

Problemi correlati