SSブログ

Android・・・Volley【画像読み込み】 [Android]

先日の『Android・・・Volley』に今度は画像読み込み処理を追加した。

今回はリストビューのリストに画像を設定していく処理を備忘録として記載する。


---------------------------------------------------------------
■Volleyの実装サンプル
---------------------------------------------------------------
①Volleyインスタンス作成・停止クラス
※Volleyはシングルインスタンスで扱うようにすること。
※画像ローダーのインスタンス作成を追加

public class VolleyHelper {
    private static final Object sLock = new Object();
    private static RequestQueue sQueue;
    private static ImageLoaderPlus sImageLoader;

    public static void resetVolley() {
        if (sQueue != null) {
            cancelQueue();
            sQueue.stop();
        }
        sQueue = null;
    }

    public static void addRequest(final Context conetxt, JsonObjectRequest request) {
        if (sQueue == null) {
            sQueue = Volley.newRequestQueue(conetxt);
        }
        sQueue.add(request);
    }

    /**
    * Volleyインスタンス作成処理
    *
    * @param conetxt コンテキスト
    * @return Volleyインスタンス
    */
    public static RequestQueue getRequestQueue(final Context conetxt) {
        synchronized (sLock) {
            if (sQueue == null) {
                sQueue = Volley.newRequestQueue(conetxt);
            }
            return sQueue;
        }
    }

    public static void startQueue(final Context conetxt) {
        if (sQueue == null) {
            sQueue = Volley.newRequestQueue(conetxt);
        }
        sQueue.start();
    }

    public static void cancelQueue() {
        if (sQueue != null) {
            sQueue.cancelAll(new RequestFilter() {;
                @Override
                public boolean apply(Request request) {
                    return true;
                }
            });
        }
    }

    public static void stopQueue() {
        if (sQueue != null) {
            sQueue.stop();
            sQueue = null;
        }
    }

    /**
    * リストまたはグリッドなど複数画像取得時のローダーインスタンス作成処理
    *
    * @param conetxt コンテキスト
    * @param bitmapCache キャッシュ容量設定
    * @return ローダーインスタンス
    */
    public static ImageLoaderPlus getImageLoader(final Context conetxt, BitmapCache bitmapCache) {
        synchronized (sLock) {
            if (sImageLoader == null) {
                sImageLoader = new ImageLoaderPlus(getRequestQueue(conetxt), bitmapCache);
            }

            return sImageLoader;
        }
    }
}




②Bitmapキャッシュクラス
※キャッシュサイズクラスを作成し柔軟にサイズ調整できるようにする。

public class BitmapCache implements ImageLoader.ImageCache {
    public static final Object sLock = new Object();
    private static LruCache mCache;

    public BitmapCache() {
        synchronized (sLock) {
            if (mCache == null) {
                int maxSize = (int) (Runtime.getRuntime().maxMemory() / 1024);
                int cacheSize = maxSize / 8;

                mCache = new LruCache(cacheSize) {
                    @Override
                    protected int sizeOf(String key, Bitmap bitmap) {
                        return bitmap.getByteCount() / 1024;
                    }
                };
            }
        }
    }

    @Override
    public Bitmap getBitmap(String url) {
        return mCache.get(url);
    }

    @Override
    public void putBitmap(String url, Bitmap bitmap) {
        mCache.put(url, bitmap);
    }
}




③アダプタによる画像読み込み・設定クラス
※画像の読み込み時は必ずローダーのキャンセルチェックを行うこと。

public class MyAdapter extends BaseAdapter {
    /** コンテキスト */
    private Context mContext;
    private LayoutInflater mInflater;
    /** リスト数 */
    private int mListNum = 0;
    /** 画像キャッシュ */
    private BitmapCache mCache = new BitmapCache();

    public InfoListAdapter(Context context, int itemCount) {
        mContext = context;
        mListNum = itemCount;
        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return mListNum;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // 本来は高速かなど考慮する為、下記のように都度viewを設定することはない(あくまでサンプル)
        view = (InfoListLayout) mInflater.inflate(R.layout.listview, null);

 ;       // リクエストのキャンセル処理
        ImageView image = (ImageView) view.findViewById(R.id.image);
        ImageLoaderPlus.ImageContainer imageContainer = (ImageLoaderPlus.ImageContainer) image.getTag();
        if (imageContainer != null) {
            imageContainer.cancelRequest();
        }

        String imageUrl = "xxxxx.png";
        ImageLoaderPlus.ImageListener listener =
            ImageLoaderPlus.getImageListener(
                image,
                R.drawable.waiting,
                R.drawable.error);
            image.setTag(VolleyHelper.getImageLoader(mContext, mCache).get(imageUrl, listener));
        }

        return view;
    }
}



後はActivityやFragment等でお決まりのリスト作成すればよい。
リスト作成時のgetView内でviewを作成する部分だが通常はレイアウトの使い回しなどを行い高速処理を施す。昔から行われているのはレイアウトをstaticで保持して使いまわす方法だがこれとは違う方法を私は実装する。次回はこの部分を備忘録として記載しる予定である。
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。