/**
   * 最主要的方法
   *
   * @param url
   * @param imageView
   * @param requiredSize 裁剪图片大小尺寸(一直裁剪到图片宽或高 至少有一个小与requiredSize的时候)
   * @param listener
   * @param defaultPicResId
   */
  public void displayImage(
      String url,
      ImageView imageView,
      int requiredSize,
      OnImageLoaderListener listener,
      int defaultPicResId) {
    imageViews.put(imageView, url);
    // 先从内存缓存中查找
    Bitmap bitmap = memoryCache.get(url);
    if (bitmap != null) {
      imageView.setImageBitmap(bitmap);
      if (null != listener) {
        listener.onFinishedImageLoader(imageView, bitmap); // 通知完成加载
      }
    } else {
      // 如果defaultPicResId小于0,则不设置默认图片
      if (defaultPicResId < 0) {
        queuePhoto(url, imageView, requiredSize, listener);
        return;
      }
      /**
       * 如果defaultPicResId等于0,则设置默认图片为config中的默认图片,并开启新线程加载真实需要的图片
       * 如果defaultPicResId大于0,则设置默认图片为指定的默认图片,并开启新线程加载真实需要的图片
       */
      if (defaultPicResId == 0) {
        defaultPicResId = config.getDefaultResId();
      }
      imageView.setImageResource(defaultPicResId);

      queuePhoto(url, imageView, requiredSize, listener);
    }
  }
 /**
  * 初始化方法(初始化各种缓存配置),推荐在Application中调用
  *
  * @param context
  */
 public static void init(Context context, CacheConfig config) {
   imageLoader = new ImageLoader();
   imageLoader.context = context;
   /** 如果配置了CacheConfig,则使用配置的Config;否则,使用默认的Config */
   imageLoader.config = null != config ? config : new CacheConfig();
   imageLoader.memoryCache = new MemoryCache(config.getMemoryCachelimit());
   /** 如果在config中配置了缓存目录,则使用之;否则,使用默认的缓存路径 */
   imageLoader.fileCache =
       new FileCache(
           imageLoader.context,
           null != config.getFileCachePath()
               ? config.getFileCachePath()
               : Environment.getExternalStorageDirectory().toString()
                   + "/Android/data/"
                   + context.getPackageName()
                   + "/cache");
 }
  /**
   * decode这个图片并且按比例缩放以减少内存消耗,虚拟机对每张图片的缓存大小也是有限制的
   *
   * @param f
   * @param requiredSize
   * @return
   */
  private Bitmap decodeFile(File f, int requiredSize) {
    try {
      // decode image size
      BitmapFactory.Options o = new BitmapFactory.Options();
      o.inJustDecodeBounds = true;
      BitmapFactory.decodeStream(new FileInputStream(f), null, o);

      // 计算合理的缩放指数(2的整幂数)
      int width_tmp = o.outWidth, height_tmp = o.outHeight;
      int scale = 1;

      while (true) {
        //                        if (width_tmp / 2 < requiredSize || height_tmp / 2 <
        // requiredSize){
        //                            break;
        //                        }
        //                        width_tmp /= 2;
        //                        height_tmp /= 2;
        //                        scale *= 2;
        if (width_tmp <= requiredSize || height_tmp <= requiredSize) {
          break;
        }
        width_tmp /= 2;
        height_tmp /= 2;
        scale *= 2;
      }

      // decode with inSampleSize
      BitmapFactory.Options o2 = new BitmapFactory.Options();
      //            o2.inSampleSize = (int) scale;
      o2.inSampleSize = scale;
      o2.inPreferredConfig = config.getBitmapConfig();
      return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);

    } catch (FileNotFoundException e) {
    }
    return null;
  }
 public void displayImage(
     String url, ImageView imageView, OnImageLoaderListener listener, int defaultPicResId) {
   displayImage(url, imageView, config.getDefRequiredSize(), listener, defaultPicResId);
 }
 public void displayImage(String url, ImageView imageView, OnImageLoaderListener listener) {
   displayImage(url, imageView, config.getDefRequiredSize(), listener, 0);
 }
 public void displayImage(String url, ImageView imageView) {
   displayImage(url, imageView, config.getDefRequiredSize(), null, 0);
 }