2011-01-25 21 views
51

Necesito descargar una página web en una aplicación de Android y me está resultando difícil decidir si utilizar el cliente http apache de Android o URLConnection de java.Apache http client o URLConnection

¿Alguna idea?

+0

2015 actualización: a partir de Android M, clases org.apache.http ahora se quitan desde el SDK. Aquí está la nota de lanzamiento oficial: http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-apache-http-client –

Respuesta

25

Para la mayoría de las cosas, diría que HttpClient es el camino a seguir. Sin embargo, hay algunas situaciones y casos extremos en los que me gustaría recurrir a un URLConnection. Ejemplos de casos extremos here y here

EDITAR
Una pregunta similar se ha hecho antes: httpclient vs httpurlconnection. Supongo que HttpUrlConnection es algo más rápido ya que el HttpClient está construido sobre las bibliotecas estándar de Java. Sin embargo, encontraría el código HttpClient mucho más rápido y fácil de escribir y mantener. De acuerdo con los comentarios a continuación, los elementos centrales de HttpClient han sido optimizados para el rendimiento.

Si el rendimiento es una gran preocupación, lo mejor es escribir dos clientes, uno con cada método, y compararlos. Si haces esto, por favor, háganos saber los resultados.

+0

¿Tiene alguna idea de quién es más rápido? –

+0

Editado mi respuesta para agregar más información –

+1

HttpClient 4.1 debe ser _significativamente_ más rápido que HttpUrlConnection. Ver http://wiki.apache.org/HttpComponents/HttpClient3vsHttpClient4vsHttpCore. Solo HttpCore simple es más rápido que HttpClient en mis pruebas – oleg

14

en Gingerbread y más tarde, HttpURLConnection es el camino a seguir. considere que Apache HttpClient está en desuso. (También en cuenta que Android no utiliza HttpClient 4.1, mencionado en otro comentario.)

si usted tiene un caso en el que Apache HttpClient es más rápido, repórtelo como un error aquí: http://code.google.com/p/android/issues/list

+1

¿De verdad? ¿Por qué? ¿Ustedes anunciaron esto en cualquier lugar? Hubiera pensado que generalmente se acepta que Apache HttpClient es la mejor API para usar. –

+8

Hughes: Google mismo nos dijo la última I | O exactamente lo contrario, que deberíamos usar HttpClient y no usar 'HttpUrlConnection'. Y, desde la última vez que miré, 'HttpURLConnection' se implementó a través de HttpClient. Esto es realmente bastante importante, por lo que sería bueno si pudiéramos publicar esto un poco más si esta es de hecho la dirección en la que Google quiere que nos dirijamos. – CommonsWare

+2

@CommonsWare Fue anunciado recientemente aquí: http://android-developers.blogspot.com/2011/09/androids-http-clients.html. La implementación de '[HttpClient] es estable y tienen pocos errores. Pero el gran tamaño de esta API hace que sea difícil para nosotros mejorarla sin romper la compatibilidad. El equipo de Android no está trabajando activamente en Apache HTTP Client. OMG. Recuerdo cómo oleg [intentó sincronizar] (http://old.nabble.com/HttpClient-in-Android-ts27915358.html) más desarrollo de proyectos con el equipo de Android. Y ahora decidieron despreciar HttpClient en su lugar, es una verdadera lástima. – Idolon

43

Google ha desaprobado en silencio Apache Uso del cliente HTTP desde Gingerbread: http://android-developers.blogspot.com/2011/09/androids-http-clients.html. Y aunque no lo marcaron con una anotación desaprobada, sugieren que use HttpURLConnection para nuevas aplicaciones como: it is where we [Google] will be spending our energy going forward.

Personalmente, no me gusta esa decisión y preferiría ceñirme a HttpClient 4.1+, ya que es más rápido, tiene menos errores y se actualiza regularmente. Y aunque no puede actualizar la biblioteca del sistema a la versión 4.1, puede incluir el paquete HttpClient en su proyecto Android (como beneficio adicional, esto le permitiría no depender de las correcciones de fallos de Google ni de las actualizaciones de los proveedores). Sin embargo, hay una trampa: para evitar posibles colisiones con la biblioteca incorporada, debe cambiar el nombre de los paquetes httpclient utilizando la herramienta JarJar. Resultó que alguien ya hizo esto (proyectos de bibliotecas Android frasco y reenvasado están disponibles para su descarga):

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

Este es un nuevo envoltorio de HttpClient 4.1 para Android. La versión de HttpClient en el SDK de Android es 4.0beta2. Se han producido varias actualizaciones de a HttpClient y algunas correcciones de errores muy necesarias, como el caché de autenticación desde 4.0beta.

Dado que Google ha desaprobado HttpClient a favor del estándar de Java HttpURLConnection he creado un script para convertir una liberación de reservas de Apache de HttpClient en una biblioteca de Android.

Cambios para abastecerse HttpClient

  • cambiado el nombre de todos los paquetes org.apache.http a ch.boye.httpclientandroidlib
  • borrarán todos los que dependen de las clases org.ietf. * (SPNEGO)
  • Sustituido org.apache.commons.codec.binary.Base64 con android.util.Base64
  • creado una nueva clase HttpClientAndroidLog para reemplazar org .apache.commons.logging
+0

Hola, estoy usando su biblioteca ahora mismo para cargar archivos usando MultipartEntity Builder y HttpEntity. Pero me preocupa si la biblioteca sigue siendo relevante para dispositivos de 22 o más. –

+0

@John Primero que nada no es mi biblioteca, ya que nunca contribuí en ese proyecto. En segundo lugar, esta respuesta tiene 4 años y la biblioteca parece no actualizarse hasta principios de 2014 y contiene vulnerabilidades que se corrigieron en las últimas versiones de HttpClient (consulte https://code.google.com/p/httpclientandroidlib/ problemas/detalles? id = 19).Actualizaré mi respuesta en breve, hasta entonces le sugiero que use uno de estos: https://hc.apache.org/httpcomponents-client-4.5.x/android-port.html o cambie al cliente OkHttp: http: //square.github.io/okhttp/ – Idolon

Cuestiones relacionadas