つのライト級のピクチャーを共有して種類のImageLoaderをロードします。


ImageLoaderのような写真はネット上で大きなプッシュをロードしています。有名なのはnostra 13のImage-Leoaderの画像ローディング、xUtilの写真ローディング、そしてFacebookのFreescoです。たくさんありますが、勉強の態度に基づいて、最近プロジェクトをする時、この需要をロードする写真があります。
中はLruCacheに関連して、ExectorService、大図のBitmap Factory原理を処理して、view.setTag()です。
はい、多く言わないで、まず一歩ずつ来ます。
まずパッケージの種類を見てみます。どうやって使いますか?

    //         
    String imageUrl = (String) t;
    //    ImageView 
    ImageView grid_item = holder.getView(R.id.grid_item);
    //    tag ,    ,        
    grid_item.setTag(imageUrl);
    
     /**
     *      
     * 
     * @param context
     *      :    
     * @param imageView
     *      : ImageView   
     * @param sourcePath
     *      :      
     * @param r_Id
     *      :       id ,R.drowable.id;
     * @param callback
     *      :       
     */
 
    new ImageLoader().displayBmp(mContext,grid_item, imageUrl, R.drawable.img_bg,this);
 
簡単ですか?
次に、ImageLoaderというクラスを具体的に分析します。
携帯電話のメモリが限られていることを知っています。すべての画像をメモリに入れることはできません。だから、androidはLru Cacheの方法を提供しています。使用するアルゴリズムは最近少なくともアルゴリズムを使います。また、画像にキャッシュを入れ続けています。少なくとも使っている写真も絶えずキャッシュを除去しています。
LruCacheの初期化コードは以下の通りです。

  public ImageLoader() {

    //        8/1         
    int cacheSize = maxMemory / 8;
    //    LruCache
    mLruCache = new LruCache<String, Bitmap>(cacheSize) {
      @Override
      protected int sizeOf(String key, Bitmap bitmap) {
        return bitmap.getByteCount();
      }
    };

  }

  /**
   *       LruCache
   */
  public void putBitmapToLruCache(String key, Bitmap bitmap) {
    if (getBitmapFromLruCache(key) == null && mLruCache != null) {
      mLruCache.put(key, bitmap);
    }
  }
  /**
   *  LruCache      
   */
  public Bitmap getBitmapFromLruCache(String key) {
    return mLruCache.get(key);
  }

LruCacheはHashMapのようにputとgetを利用してキャッシュされたものです。
次に画像の具体的なロードを見て、まずコードを貼り付けます。

  /**
   *      
   * 
   * @param context
   *      :    
   * @param imageView
   *      : ImageView   
   * @param sourcePath
   *      :      
   * @param r_Id
   *      :       id ,R.drowable.id;
   * @param callback
   *      :       
   */
  public void displayBmp(final Context context, final ImageView imageView, final String sourcePath, final int r_Id,
      final ImageCallback callback) {

    final String path;

    if (!TextUtils.isEmpty(sourcePath)) {
      path = sourcePath;

    } else {
      return;
    }
    //                 , path        key
    Bitmap bmp = mLruCache.get(path);

    if (bmp != null) {
      if (callback != null) {
        //         
        callback.imageLoad(imageView, bmp, sourcePath);
      }
      // imageView.setImageBitmap(bmp);
      return;
    }
    //    bmp == null ,  imageView       
    imageView.setImageResource(r_Id);
    //       
    threadPoolUtils.getExecutorService().execute(new Runnable() {
      Bitmap bitmap = null;

      @Override
      public void run() {
        // TODO Auto-generated method stub

        try {
          //                  
          bitmap = revitionImageSize(imageView, sourcePath);
        } catch (Exception e) {

        }
        if (bitmap == null) {
          try {
            //                         
            bitmap = BitmapFactory.decodeResource(context.getResources(), r_Id);
          } catch (Exception e) {
          }
        }
        if (path != null && bitmap != null) {
          //             , path    key
          putBitmapToLruCache(path, bitmap);
        }

        if (callback != null) {
          handler.post(new Runnable() {
            @Override
            public void run() {
              //         
              callback.imageLoad(imageView, bitmap, sourcePath);

            }
          });
        }

      }
    });

  }

コードはあまり多くないです。主にキャッシュから画像をロードします。画像を空にすると、携帯の画像アドレスから画像をロードします。bitmap = revitionImageSize(imageView, sourcePath);
キャッシュの写真をロードして多く言いませんでした。見たのも分かります。こんなに簡単です
この方法を具体的に分析しましょう。

  public Bitmap revitionImageSize(ImageView imageView, String path) throws IOException {

    //       ImageView     
    int img_width = imageView.getWidth();
    int img_height = imageView.getHeight();
 
    BufferedInputStream in = new BufferedInputStream(new FileInputStream(new File(path)));
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;

    BitmapFactory.decodeStream(in, null, options);
    in.close();

    int height = options.outHeight;
    int width = options.outWidth;

    Bitmap bitmap = null;
 
    int inSampleSize = 1;

    //                
    final int heightRatio = Math.round((float) height / (float) img_height);
    final int widthRatio = Math.round((float) width / (float) img_width);
    //              inSampleSize  ,              
    //               。
    inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
    //            inSampleSize 
    options.inSampleSize = inSampleSize;

    options.inJustDecodeBounds = false;
    in = new BufferedInputStream(new FileInputStream(new File(path)));
    bitmap = BitmapFactory.decodeStream(in, null, options);

    in.close();
    return bitmap;
  }

コードにもコメントが書いてありますが、画像をロードする際には一定の圧縮処理がありますので、上の処理方法もよくあります。表示する画像はイメージコントロールの大きさによって圧縮します。
画像の圧縮処理がよく分からない友達に対しては、簡単に説明します。
まず画像をロードしました。BufferedInputStream in = new BufferedInputStream(new FileInputStream(new File(path)));
そして:options.inJustDecodeBounds = true;
次に:

int height = options.outHeight;
int width = options.outWidth;
この時の注意プログラムは写真を本当に読み込んでいません。options.inJust DecodeBounds=trueです。
これは役割を果たしていますが、画像の幅と高さの情報を得て、圧縮画像を処理できます。
画像を圧縮してから:options.inJustDecodeBounds = false;
圧縮された画像を再取得:bitmap = BitmapFactory.decodeStream(in, null, options);
説明済み。
コードをよく見ると、学生がdisplayBmp()方法にはフィードバックパラメータがあります。
コールバックインターフェースは以下の通りです。

  /**
   *       
   * 
   * @author Administrator
   *
   */
  public interface ImageCallback {
    public void imageLoad(ImageView imageView, Bitmap bitmap, Object... params);
  }
具体的な実装は、画像を表示する場所でのコールバックです。

   /**
   *        
   */
  @Override
  public void imageLoad(ImageView imageView, Bitmap bitmap, Object... params) {
    if (imageView != null && bitmap != null) {
      String url = (String) params[0];

      //        url       imageView.getTag()
      //                                        !!!!
      if (url != null && url.equals((String) imageView.getTag())) {

        ((ImageView) imageView).setImageBitmap(bitmap);
      }
    }
  }

コードの注釈のところも書いてあります。よく分からない学生は私信交流ができます。また、私のgithub github接続のソースコードを添付してください。運行の便利さが分かります。
あなたが使いやすいように、あなたのプロジェクトに次のような依存を追加すればいいです。

dependencies {
      compile 'com.zts:imageloader:1.1.1'

  }