2011-01-25 18 views
51

Ho bisogno di scaricare una pagina Web su un'app per Android e sto facendo fatica a decidere se utilizzare il client http di Apache Android o l'URLConnection di java.Apache http client o URLConnection

Qualche idea?

+0

Aggiornamento 2015: A partire da Android M, le classi org.apache.http sono ora rimosse dall'SDK. Ecco la nota di rilascio ufficiale: http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-apache-http-client –

risposta

25

Per la maggior parte delle cose, direi che HttpClient è la strada da percorrere. Tuttavia ci sono alcune situazioni e casi limite in cui tornerei a un URLConnection. Esempi di casi limite here e here

EDIT
Una domanda simile è stato chiesto prima: httpclient vs httpurlconnection. Suppongo che lo HttpUrlConnection sia leggermente più veloce in quanto lo HttpClient è costruito sopra le librerie Java standard. Comunque troverei il codice HttpClient molto più veloce e più facile da scrivere e mantenere. In base ai commenti riportati di seguito, gli elementi principali di HttpClient sono stati ottimizzati per le prestazioni.

Se la prestazione è una delle principali preoccupazioni, la soluzione migliore è scrivere due client, uno con ciascun metodo, quindi confrontarli entrambi. Se lo fai, facci sapere i risultati.

+0

Hai qualche idea su chi è più veloce? –

+0

Modificata la mia risposta per aggiungere ulteriori informazioni –

+1

HttpClient 4.1 dovrebbe essere _significantly_ più veloce di HttpUrlConnection. Vedi http://wiki.apache.org/HttpComponents/HttpClient3vsHttpClient4vsHttpCore. Solo HttpCore è più veloce di HttpClient nei miei test – oleg

14

in Gingerbread e in seguito, HttpURLConnection è la strada da percorrere. considera Apache HttpClient deprecato. (Da notare anche che Android non usa HttpClient 4.1, citato in un altro commento.)

se si dispone di un caso in cui Apache HttpClient è più veloce, segnalarlo come un bug qui: http://code.google.com/p/android/issues/list

+1

Davvero? Perché? Avete annunciato questo ragazzi ovunque? Avrei pensato che fosse generalmente d'accordo che Apache HttpClient fosse l'API migliore da usare. –

+8

Hughes: Google stesso ci ha detto l'ultimo I | O esattamente l'opposto, che dovremmo usare HttpClient e non usare 'HttpUrlConnection'. E, dall'ultima volta che ho guardato, 'HttpURLConnection' è stato implementato tramite HttpClient. Questo è davvero piuttosto importante, quindi sarebbe bello se potessimo pubblicizzarlo un po 'di più se questa è davvero la direzione che Google vuole che ci dirigiamo. – CommonsWare

+2

@CommonsWare È stato annunciato solo di recente qui: http://android-developers.blogspot.com/2011/09/androids-http-clients.html. L'implementazione di '[HttpClient] è stabile e hanno pochi bug. Ma la grande dimensione di questa API rende difficile per noi migliorarla senza rompere la compatibilità. Il team Android non sta lavorando attivamente su Apache HTTP Client. OMG. Ricordo come oleg [tentato di sincronizzare] (http://old.nabble.com/HttpClient-in-Android-ts27915358.html) ulteriore sviluppo del progetto con il team di Android. E ora hanno deciso di deprecare HttpClient invece - questo è un vero peccato. – Idolon

43

Google ha silenziosamente deprecato Apache Utilizzo del client HTTP dal Gingerbread: http://android-developers.blogspot.com/2011/09/androids-http-clients.html. E anche se non lo hanno contrassegnato con annotazioni obsolete, suggeriscono di utilizzare HttpURLConnection per nuove applicazioni come: it is where we [Google] will be spending our energy going forward.

Personalmente non mi piace questa decisione e preferisco attenermi a HttpClient 4.1+, poiché è più veloce, ha meno bug e viene aggiornato regolarmente. E mentre non è possibile aggiornare la libreria di sistema alla versione 4.1, è possibile includere il jar HttpClient nel progetto Android (come ulteriore vantaggio che ciò consentirebbe di non dipendere dalle correzioni di bug e dagli aggiornamenti dei fornitori di Google). Tuttavia, c'è una trappola: per evitare possibili collisioni con la libreria integrata, è necessario rinominare i pacchetti httpclient usando lo strumento JarJar. Si è rivelato qualcuno già ha fatto questo (barattolo riconfezionato e progetti di libreria Android sono disponibili per il download):

http://code.google.com/p/httpclientandroidlib/

Questo è un riconfezionamento di HttpClient 4.1 per Android. La versione di HttpClient nell'SDK di Android è 4.0beta2. Ci sono stati diversi aggiornamenti di a HttpClient e alcune correzioni di bug tanto necessarie come auth caching dal 4.0beta.

Dal momento che Google ha deprecato HttpClient a favore di standard di Java HttpURLConnection ho creato uno script per convertire un rilascio di magazzino Apache di HttpClient in una libreria di Android.

Modifiche al magazzino HttpClient

  • Rinominato tutti i pacchetti org.apache.http a ch.boye.httpclientandroidlib
  • cancellato tutte le classi che dipendono org.ietf. * (autenticazione SPNEGO)
  • Sostituito org.apache.commons.codec.binary.Base64 con android.util.Base64
  • Creato una nuova classe HttpClientAndroidLog per sostituire org .apache.commons.logging
+0

Ciao, sto usando la tua libreria in questo momento per caricare file usando MultipartEntity Builder e HttpEntity. Ma mi preoccupo se la libreria è ancora rilevante per i dispositivi 22 e sopra. –

+0

@John Prima di tutto non è la mia biblioteca, dato che non ho mai contribuito a quel progetto. In secondo luogo, questa risposta ha 4 anni e la libreria sembra non essere aggiornata fino all'inizio del 2014 e contiene vulnerabilità che sono state corrette nelle ultime versioni di HttpClient (vedere https://code.google.com/p/httpclientandroidlib/ problemi/dettaglio? id = 19).Aggiornerò la mia risposta a breve, fino a quel momento suggerisco di utilizzare uno di questi: https://hc.apache.org/httpcomponents-client-4.5.x/android-port.html o passare al client di OkHttp: http: //square.github.io/okhttp/ – Idolon

Problemi correlati