图像加载程序不加载图像

时间:2016-10-28 01:59:57

标签: android image

嗨我有图像加载器类,它从Web加载图像并在手机上缓存问题 在手机上没有SD卡(外部存储器)图像没有从网上加载如何解决它 这是图像加载器类代码

 public class ImageLoader {

  final int stub_id = R.drawable.ic_thumbnail;
  MemoryCache memoryCache = new MemoryCache();
  FileCache fileCache;
  ExecutorService executorService;
  private Map<ImageView, String> imageViews = Collections.synchronizedMap(new WeakHashMap<ImageView, String>());

  public ImageLoader(Context context) {
  fileCache = new FileCache(context);
  executorService = Executors.newFixedThreadPool(5);
  }

  public void DisplayImage(String url, ImageView imageView) {
  imageViews.put(imageView, url);
  Bitmap bitmap = memoryCache.get(url);
  if (bitmap != null)
  imageView.setImageBitmap(bitmap);
  else {
  queuePhoto(url, imageView);
  imageView.setImageResource(stub_id);
  }
  }

  private void queuePhoto(String url, ImageView imageView) {
  PhotoToLoad p = new PhotoToLoad(url, imageView);
  executorService.submit(new PhotosLoader(p));
  }

  private Bitmap getBitmap(String url) {
  File f = fileCache.getFile(url);

  //from SD cache
  Bitmap b = decodeFile(f);
  if (b != null)
  return b;

  //from web
  try {
  Bitmap bitmap = null;
  URL imageUrl = new URL(url);
  HttpURLConnection conn = (HttpURLConnection) imageUrl.openConnection();
  conn.setConnectTimeout(30000);
  conn.setReadTimeout(30000);
  conn.setInstanceFollowRedirects(true);
  InputStream is = conn.getInputStream();
  OutputStream os = new FileOutputStream(f);
  Utils.CopyStream(is, os);
  os.close();
  bitmap = decodeFile(f);
  return bitmap;
  } 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 = 150;
  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 *= 2;
  }

  //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;
  }

  boolean imageViewReused(PhotoToLoad photoToLoad) {
  String tag = imageViews.get(photoToLoad.imageView);
  if (tag == null || !tag.equals(photoToLoad.url))
  return true;
  return false;
  }

  public void clearCache() {
  memoryCache.clear();
  fileCache.clear();
  }

  //Task for the queue
  private class PhotoToLoad {
  public String url;
  public ImageView imageView;

  public PhotoToLoad(String u, ImageView i) {
  url = u;
  imageView = i;
  }
  }

  class PhotosLoader implements Runnable {
  PhotoToLoad photoToLoad;

  PhotosLoader(PhotoToLoad photoToLoad) {
  this.photoToLoad = photoToLoad;
  }

  public void run() {
  if (imageViewReused(photoToLoad))
  return;
  Bitmap bmp = getBitmap(photoToLoad.url);
  memoryCache.put(photoToLoad.url, bmp);
  if (imageViewReused(photoToLoad))
  return;
  BitmapDisplayer bd = new BitmapDisplayer(bmp, photoToLoad);
  Activity a = (Activity) photoToLoad.imageView.getContext();
  a.runOnUiThread(bd);
  }
  }

  //Used to display bitmap in the UI thread
  class BitmapDisplayer implements Runnable {
  Bitmap bitmap;
  PhotoToLoad photoToLoad;

  public BitmapDisplayer(Bitmap b, PhotoToLoad p) {
  bitmap = b;
  photoToLoad = p;
  }

  public void run() {
  if (imageViewReused(photoToLoad))
  return;
  if (bitmap != null) {
  photoToLoad.imageView.setImageBitmap(bitmap);

  }//else
  // photoToLoad.imageView.setImageResource(stub_id);
  }
  }

  }

1 个答案:

答案 0 :(得分:2)

您可能希望使用LRU Cache,并且非常容易设置。

final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);

// Use 1/8th of the available memory for this memory cache.
final int cacheSize = maxMemory / 8;

mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
   @Override
   protected int sizeOf(String key, Bitmap bitmap) {
      // The cache size will be measured in kilobytes rather than number of items.
      return bitmap.getByteCount() / 1024;
   }
};
public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
    if (getBitmapFromMemCache(key) == null) {
        mMemoryCache.put(key, bitmap);
    }
}

public Bitmap getBitmapFromMemCache(String key) {
    return mMemoryCache.get(key);
}

参考 - https://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

我强烈建议使用像毕加索或滑翔之类的图像库或者像Volley这样的网络库,而不是自己编写,我使用LRU缓存并且运行良好。