Estoy tratando de crear una aplicación que se utiliza para descargar imágenes del servidor y mostrarlas en la vista de lista. El problema que tuve fue la pérdida de memoria y la falla de la aplicación. Estaba buscando en el blog de Android como este link, muestra una gran idea, pero aún no es suficiente para hacerlo con múltiples hilos. Algunos dispositivos de Android pueden funcionar con él, pero algunos dispositivos solo pueden manejarlos en una sola cadena y, a veces, no funcionan en absoluto.Imagen de descarga de Android del servidor y guardar en sdcard sin utilizar BitmapFactory
Mi aplicación tiene muchas actividades y cada una de ellas tiene una vista de lista que necesita mostrar la imagen lo más rápido posible. A través de Google IO 2012 usan buffer para guardar la imagen original en la tarjeta SD y soluciona el problema de memoria de fuga pero hace que la carga sea lenta ya que la imagen que necesita descargar era demasiado grande.
Mi pregunta es: ¿Hay alguna manera de escalar la imagen junto con escribir la imagen en la tarjeta SD? Intuyo que una posible solución es usar Omitir byte en el objeto inputstream y pude encontrar Width and Height también Bit por píxel de la imagen que necesito descargar.
El siguiente código se usó en Google IO 2012 y funciona bien con varios subprocesos, en mi caso tengo 4 subprocesos ejecutándose en segundo plano.
private void downloadAndWriteFile(final String url, final File file) throws OutOfMemoryError {
BufferedOutputStream out = null;
try {
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
conn.setDoInput(true);
conn.connect();
final InputStream in = new BufferedInputStream(conn.getInputStream(), IO_BUFFER_SIZE_BYTES); // buffer size 1KB
out = new BufferedOutputStream(new FileOutputStream(file), IO_BUFFER_SIZE_BYTES);
int b;
while ((b = in.read()) != -1) {
out.write(b);
}
out.close();
conn.disconnect();
}
catch (Exception e) {
Log.e(TAG, "!!downloadAndWriteFile " + e.getMessage());
file.delete();
}
}
Gracias por su respuesta, ya he pasado por este caso, pero todavía tengo memoria de fuga con múltiples hilos para algunos dispositivos que no permiten que JNI asigne más memoria. El código de Google IO 2012 puede hacer que funcione con múltiples hilos que admitan todos los dispositivos, pero es muy lento en caso de que la imagen sea demasiado grande. De alguna manera, el usuario navega rápidamente por la actividad, por lo que la primera vez que carga, no es nada bueno. – vsatkh