2010-12-14 12 views
6

Necesito saber: ¿Cuál es la forma más rápida de descargar varios pulgares seguidos, digamos 10 imágenes? Parece que el navegador incorporado hace esto de una manera muy inteligente.Android: ¿Cuál es la forma más rápida de cargar varios bitmaps/thumbs a través de http?

tengo Google'd y encontró que la mayoría de los desarrolladores están utilizando la clase HttpURLConnection para descargar un archivo JPEG para mostrarla en un ImageView, dentro de un ListAdapter etc.

Algunos desarrolladores implementa la descarga mediante el uso de la clase, ya que DefaultHttpClient tiene mejor soporte para los tiempos de espera, etc. De hecho, Google recommends para usar el cliente Apache Http, y no el HttpUrlConnection nativo de Java. Dicho esto, ambas estrategias mencionadas funcionan bien, pero son muy lentas en comparación con la forma en que el navegador integrado en mi HTC desea descargar miniaturas. El navegador integrado parece descargar imágenes de 5x-10x más rápido que cuando intento descargar los mismos mapas de bits con mi propio código. Y sí, siempre hago el trabajo de descarga/http en un hilo de trabajo separado (no en el hilo de GUI).

¿Alguien sabe cómo está descargando pulgares el navegador integrado, o al menos cuál es la forma más rápida de descargar varias imágenes de un servidor?

He intentado usar este código:

DefaultHttpClient client = new DefaultHttpClient(); 
HttpParams httpParameters = new BasicHttpParams(); 
HttpConnectionParams.setConnectionTimeout(httpParameters, CONNECTION_TIMEOUT); 
HttpConnectionParams.setSoTimeout(httpParameters, SO_TIMEOUT);  
client.setParams(httpParameters); 
client.setKeepAliveStrategy(new ConnectionKeepAliveStrategy() { 
    @Override 
    public long getKeepAliveDuration(HttpResponse response, HttpContext context) 
    { 
     return 5000; 
    } 
}); 

Ahora, puedo utilizar esta conexión para obtener varios mapas de bits/pulgares en un bucle for:

public static Bitmap downloadBitmap(String url, DefaultHttpClient client){ 

    HttpResponse response = null; 
    HttpGet get = new HttpGet(url); 
    try { 
     response = client.execute(get); 
     return BitmapFactory.decodeStream(response.getEntity().getContent()); 
    } 
    catch (ClientProtocolException e1) { 
     e1.printStackTrace(); 
    } 
    catch (IllegalStateException e){ 
     e.printStackTrace(); 
    } 
    catch (IOException e1) { 
     e1.printStackTrace(); 
    } 

    return null; 
} 

He creado un TestPage.html con 10 mapas de bits y lo cargó con el navegador incorporado. El navegador muestra la página con todos los pulgares en 1 segundo. Y estoy seguro de que no se almacenan en la memoria caché en el navegador, ya que asigné al azar las 10 imágenes para cada actualización de página.

Cuando intento hacer una actividad simple que descarga y muestra los mismos pulgares, es mucho más lenta.

Espero que el equipo de Google Android recoja esto y lo incluya en uno de sus videos habla sobre la próxima conferencia de desarrolladores.

Deben definir una mejor práctica para esto, ya que parece que cada desarrollador trata de resolver este caso de uso de "descargar-mapa de bits" a su manera, cuando de hecho estamos tratando de hacer lo mismo.

También he probado usando el mismo objeto DefaultHttpClient para buscar varias imágenes al ejecutar execute() con direcciones diferentes (objetos HttpGet), pero aún está lejos de la velocidad del navegador incorporado. Veo que mis solicitudes se han sentado en la bandera de mantener vivo de la conexión, pero no parece hacer ninguna diferencia.

Respuesta

1

Hay dos razones por las que la incorporada en el navegador es más rápido que su código:

  1. El navegador se ejecuta principalmente en código nativo (por ejemplo WebKit)
  2. descargas múltiples se realizan simultáneamente (múltiples hilos)
+0

Es casi seguro que el navegador está haciendo todas las descargas a la vez, no en serie, como en el código de la publicación.Ambos usan la misma E/S subyacente en la plataforma; la diferencia en el código de envoltura en Java vs WebKit seguramente debe ser de una magnitud menor que la latencia de la red móvil. –

+0

No: la concurrencia es la razón principal, la latencia, especialmente para dispositivos de red móvil que dominarán cualquier transferencia. Las descargas paralelas reducen efectivamente el tiempo total de transferencia por N-1 * RTT – symcbean

1

Utilizaría hilos para descargar varias imágenes a la vez. Esto debería ayudar a poner su código a la par con el navegador.

Cuestiones relacionadas