Reutilizando HttpURLConnection

En mi aplicación estoy usando un código como el siguiente para descargar varias imágenes. ¿Es de alto rendimiento hacerlo así o puedo reutilizar la conexión de alguna manera?

   for(int i = 0; i < 100; i++){  
    URL url = new URL("http://www.android.com/image" + i + ".jpg");
           HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
           try {
             InputStream in = new BufferedInputStream(urlConnection.getInputStream());
             readStream(in);
            finally {
             urlConnection.disconnect();
           }
         }
}
Respuesta 1

Realmente no obtendrá ningún beneficio de la reutilización de HttpURLConnection.

Una cosa que beneficiará enormemente a su aplicación es si pasa algún tiempo investigando las tareas asíncronas , lo que le permitirá aprovechar el poder de las solicitudes HTTP multiproceso con devoluciones de llamadas a su código principal.

Consulte: http://www.vogella.com/articles/AndroidPerformance/article.html para ver un buen ejemplo de cómo se pueden utilizar las tareas asíncronas.

Sin embargo, un buen punto de partida es, por supuesto, el Blog de desarrolladores de Android , donde tienen un ejemplo para descargar una imagen de un servidor de forma asincrónica, que se ajustará perfectamente a sus requisitos. Con alguna adaptación, puede hacer que su aplicación envíe múltiples solicitudes asincrónicas a la vez para obtener un buen rendimiento.

El artículo de Google se puede encontrar en: http://android-developers.blogspot.co.uk/2009/05/paless-threading.html

El área clave a tener en cuenta es:

public void onClick(View v) {
  new DownloadImageTask().execute("http://example.com/image.png");
}

private class DownloadImageTask extends AsyncTask {
     protected Bitmap doInBackground(String... urls) {
         return loadImageFromNetwork(urls[0]);
     }

     protected void onPostExecute(Bitmap result) {
         mImageView.setImageBitmap(result);
     }
 }

El loadImageFromNetworkmétodo es donde tiene lugar la descarga, y será completamente asíncrono lejos de su hilo principal de la interfaz de usuario.

Como ejemplo básico, puede modificar su aplicación para llamar a esto así:

for(int i = 0; i < 100; i++){  
    new DownloadImageTask().execute("http://www.android.com/image" + i + ".jpg");
}

Aunque para una optimización, no arrojaría 100 solicitudes a la vez, tal vez creando un sistema de cola Roscado que permita tal vez 4 o 5 conexiones concurrentes y luego mantenga el resto cuando otro termine manteniendo una ArrayListde las solicitudes pendientes para leer .

Respuesta: 2

Estoy atrapado con el siguiente problema. Digamos, tengo una solicitud que tiene 1000 elementos, y me gustaría utilizar Java Executor para resolver esto. Aquí está el método principal public static void main (String [] ...

Recientemente he estado jugando con Bicubic Interpolation, ya que quiero generar la tierra, basada en mapas de altura reales dentro de Minecraft. La razón por la que estoy usando la interpolación es porque yo ...

Estoy usando Ubuntu 10.10 amd64, Sun JDK 6.0.24 y el paquete ghostscript predeterminado. Ahora, estoy tratando de que funcione la muestra "Renderizar un documento PDF usando SimpleRenderer" de la página Ghost4J. Mientras ...

Como ejercicio de aprendizaje personal, escribí esta expresión regular para dividir una cadena unaria en partes cuya longitud aumenta los poderes de dos (ver también en ideone.com): for (String s: new String (new ...