うさがにっき

読書感想文とプログラムのこと書いてきます

画面の表示が遅い場合に使う画像の非同期表示

概要

画像などを多用すると、画面の表示完了までに時間がかかる
そのため、一度画面を表示してから非同期に画像を表示する

やりかた

platform/frameworks/volley - Git at Google
からvolleyプロジェクトをダウンロード
volleyライブラリ property > Android > isLibraryをチェック
対象プロジェクト property > Android > Libraryにvolleyプロジェクトを追加

Activityの各ライフサイクルメソッドで以下を追加

private RequestQueue mQueue;

@Override
public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	mQueue = Volley.newRequestQueue(getActivity());
}



@Override
public void onResume() {
	super.onResume();

	if (mQueue != null) {
		mQueue.start();
	}
}

@Override
public void onPause() {
	super.onPause();
	
	if (mQueue != null) {
          mQueue.stop();
     }
}

volleyは本来通信用ライブラリなので、Request用のqueueを持っている(今回は使わない)
このrequestQueueをもとにImageLoaderを取得する

mImageLoader = new ImageLoader(mQueue, new MyLruCache());

MyLruCacheクラスはキャッシュメモリサイズを指定したクラス

public class MyLruCache implements ImageCache {
	private LruCache<String, Bitmap> mMemoryCache;

	public MyLruCache() {
		int maxSize = 1 * 1024 * 1024;
		mMemoryCache = new LruCache<String, Bitmap>(maxSize) {
			@Override
			protected int sizeOf(String key, Bitmap value) {
				return value.getRowBytes() * value.getHeight();
			}
		};
	}

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

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

maxsizeにキャッシュとして利用するメモリのサイズを指定する
LruCacheクラスは3.x以降に実装されたクラスだがsupportv4にもあるので安心

public class MyLruCache implements ImageCache {
 
	MyLruCache(){
	}

	// ImageCacheのインターフェイス実装
	@Override
	public Bitmap getBitmap(String url) {
	  return null;
	}

	@Override
	public void putBitmap(String url, Bitmap bitmap) {

	}
}

キャッシュを割り当てたくないときはこんな感じで実装する

ImageContainer imageContainer = (ImageContainer) holder.challengeThumbnail
		.getTag();
if (imageContainer != null) {
	imageContainer.cancelRequest();
}

画像が既に存在するときは読み込みキャンセル

ImageListener listener = com.android.volley.toolbox.ImageLoader
		.getImageListener(holder.imageView,
				android.R.drawable.ic_cancel,
				android.R.drawable.ic_get);
holder.imageView.setTag(mImageLoader.get(imageUrl,
		listener));

ImageListenerをImageLoaderから取得する
第一引数・・・imageView
第二引数・・・読み込み中画像
第三引数・・・読み込み失敗時画像

ImageLoader#getで画像を設定

volleyは本来通信用ライブラリだけど、画像の非同期表示としても優秀なのでとてもすてき

参考
Volleyの使い方 | レピカグループの技術者ブログ
ネットワーク通信用ライブラリVolleyを使いこなす | Tech Booster