Cómo manejar Loading Images in Android

Posible duplicado:
Android – ¿Cómo hago una carga perezosa de imágenes en ListView

He estado tratando de entender esto por unos días, pero no puedo parecerse a envolver mi mente en todo el proceso. Mi aplicación accede a varias imágenes de un servidor. A partir de ahora, está configurado para cargar una imagen a la vez y mostrarla. Cuando el usuario pulsa el siguiente botón, la siguiente imagen se carga y se muestra. Pero el tiempo de carga es un poco demasiado largo. ¿Qué se puede hacer para mejorar el tiempo de carga de la siguiente imagen?

He estado jugando con hilos y AsyncTask. Mi idea era mantener las imágenes anteriores y siguientes en la memoria también. Cuando el usuario toca a continuación, hago lo siguiente:

prevImage = currentImage; currentImage = nextImage; nextImage = getBitmapfromURL(urlPath); 

Y el nextImage se ejecuta realmente en AsyncTask o Thread. Mi problema con esto es si el usuario pulsa el botón siguiente antes de completar el hilo (que simplemente muestra una imagen en blanco). Así que no estoy seguro de si ese es el camino a seguir. ¿Hay otra manera de mejorar el tiempo de carga de estas imágenes? Cualquier idea sería apreciada.

One Solution collect form web for “Cómo manejar Loading Images in Android”

Esta es mi clase para cargar la imagen desde el servidor.

 package test; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.net.URL; import java.util.HashMap; import java.util.Stack; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.widget.ImageView; import com.com.app.R; public class ImageLoader { // the simplest in-memory cache implementation. This should be replaced with // something like SoftReference or BitmapOptions.inPurgeable(since 1.6) private HashMap<String, Bitmap> cache = new HashMap<String, Bitmap>(); private File cacheDir; public ImageLoader(Context context) { // Make the background thead low priority. This way it will not affect // the UI performance photoLoaderThread.setPriority(Thread.NORM_PRIORITY - 1); // Find the dir to save cached images if (android.os.Environment.getExternalStorageState().equals( android.os.Environment.MEDIA_MOUNTED)) cacheDir = new File( android.os.Environment.getExternalStorageDirectory(), "LazyList"); else cacheDir = context.getCacheDir(); if (!cacheDir.exists()) cacheDir.mkdirs(); } final int stub_id = R.drawable.no_image; public void DisplayImage(String url, Activity activity, ImageView imageView) { if (cache.containsKey(url)) imageView.setImageBitmap(cache.get(url)); else { queuePhoto(url, activity, imageView); imageView.setImageResource(stub_id); } } private void queuePhoto(String url, Activity activity, ImageView imageView) { // This ImageView may be used for other images before. So there may be // some old tasks in the queue. We need to discard them. photosQueue.Clean(imageView); PhotoToLoad p = new PhotoToLoad(url, imageView); synchronized (photosQueue.photosToLoad) { photosQueue.photosToLoad.push(p); photosQueue.photosToLoad.notifyAll(); } // start thread if it's not started yet if (photoLoaderThread.getState() == Thread.State.NEW) photoLoaderThread.start(); } private Bitmap getBitmap(String url) { // // I identify images by hashcode. Not a perfect solution, good for // the // // demo. // String filename = String.valueOf(url.hashCode()); // File f = new File(cacheDir, filename); // // // from SD cache // Bitmap b = decodeFile(f); // if (b != null) // return b; // from web try { return new BitmapDrawable(new URL(url).openStream()).getBitmap(); } catch (Exception ex) { ex.printStackTrace(); return null; } } // decodes image and scales it to reduce memory consumption private Bitmap decodeFile(File f) { try { // decode image size BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; BitmapFactory.decodeStream(new FileInputStream(f), null, o); // Find the correct scale value. It should be the power of 2. final int REQUIRED_SIZE = 70; int width_tmp = o.outWidth, height_tmp = o.outHeight; int scale = 1; while (true) { if (width_tmp / 2 < REQUIRED_SIZE || height_tmp / 2 < REQUIRED_SIZE) break; width_tmp /= 2; height_tmp /= 2; scale++; } // decode with inSampleSize BitmapFactory.Options o2 = new BitmapFactory.Options(); o2.inSampleSize = scale; return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); } catch (FileNotFoundException e) { } return null; } // Task for the queue private class PhotoToLoad { public String url; public ImageView imageView; public PhotoToLoad(String u, ImageView i) { url = u; imageView = i; } } PhotosQueue photosQueue = new PhotosQueue(); public void stopThread() { photoLoaderThread.interrupt(); } // stores list of photos to download class PhotosQueue { private Stack<PhotoToLoad> photosToLoad = new Stack<PhotoToLoad>(); // removes all instances of this ImageView public void Clean(ImageView image) { for (int j = 0; j < photosToLoad.size();) { if (photosToLoad.get(j).imageView == image) photosToLoad.remove(j); else ++j; } } } class PhotosLoader extends Thread { public void run() { try { while (true) { // thread waits until there are any images to load in the // queue if (photosQueue.photosToLoad.size() == 0) synchronized (photosQueue.photosToLoad) { photosQueue.photosToLoad.wait(); } if (photosQueue.photosToLoad.size() != 0) { PhotoToLoad photoToLoad; synchronized (photosQueue.photosToLoad) { photoToLoad = photosQueue.photosToLoad.pop(); } Bitmap bmp = getBitmap(photoToLoad.url); cache.put(photoToLoad.url, bmp); if (photoToLoad.url == null) { photoToLoad.url = "http://192.168.0.2/phpdemoprojects/cardsonmobile/uploads/cards/0009.png"; } else { if (((String) photoToLoad.imageView.getTag()) .equals(photoToLoad.url)) { BitmapDisplayer bd = new BitmapDisplayer(bmp, photoToLoad.imageView); Activity a = (Activity) photoToLoad.imageView .getContext(); a.runOnUiThread(bd); } } } if (Thread.interrupted()) break; } } catch (InterruptedException e) { // allow thread to exit } } } PhotosLoader photoLoaderThread = new PhotosLoader(); // Used to display bitmap in the UI thread class BitmapDisplayer implements Runnable { Bitmap bitmap; ImageView imageView; public BitmapDisplayer(Bitmap b, ImageView i) { bitmap = b; imageView = i; } public void run() { if (bitmap != null) imageView.setImageBitmap(bitmap); else imageView.setImageResource(stub_id); } } public void clearCache() { // clear memory cache cache.clear(); // clear SD cache File[] files = cacheDir.listFiles(); for (File f : files) f.delete(); } } 

Espero que esto te ayude

  • Osmdroid: ¿Cómo puedo crear y cargar un mapa de mis propios mapas de bits (mosaicos)?
  • Sustitución de un color en un mapa de bits
  • Android: ¿Es posible dibujar una vista en la parte superior del mapa como una superposición
  • Combinación de 2 imágenes superpuestas
  • Uso de la funcionalidad mapfragment sin conexión
  • Convertir imagen a mapa de bits en android
  • Android, la forma más rápida de dibujar un mapa de bits a la lona
  • Android - BitmapFactory.decodeByteArray - OutOfMemoryError (OOM)
  • Cómo cambiar el tamaño de la imagen (mapa de bits) a un tamaño determinado?
  • Android: anchura y altura del mapa de bits sin cargarlo
  • Mostrar mapa de bits de cualquier tamaño en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.