ピクチャリソースの非同期ロード

2901 ワード

携帯電話のネット速度はブロードバンドの速度に及ばない
画像をロードするときは非同期でロードし、全体のページを先に表示する必要があります.
 
 
public class AsyncImageLoader {

	private HashMap<String, SoftReference<Bitmap>> imageCache;
	private static AsyncImageLoader asyncImageLoader;

	public AsyncImageLoader() {
		imageCache = new HashMap<String, SoftReference<Bitmap>>();
	}

	/**
	 * @return  
	 */
	public static AsyncImageLoader getInstance() {
		if (asyncImageLoader == null) {
			asyncImageLoader = new AsyncImageLoader();
		}
		return asyncImageLoader;
	}

	/**
	 * @param imageUrl
	 *             url
	 * @param imageCallback
	 *             
	 * @return  
	 */
	public Bitmap loadDrawable(final String imageUrl,
			final ImageCallback imageCallback) {
		if (imageCache.containsKey(imageUrl)) {
			SoftReference<Bitmap> softReference = imageCache.get(imageUrl);
			Bitmap bitmap = softReference.get();
			if (bitmap != null) {
				return bitmap;
			}
		}
		final Handler handler = new Handler() {
			public void handleMessage(Message message) {
				imageCallback.imageLoaded((Bitmap) message.obj, imageUrl);
			}
		};
		new Thread() {
			@Override
			public void run() {
				Bitmap bitmap = loadImageFromUrl(imageUrl);
				imageCache.put(imageUrl, new SoftReference<Bitmap>(bitmap));
				Message message = handler.obtainMessage(0, bitmap);
				handler.sendMessage(message);
			}
		}.start();
		return null;
	}

	/**
	 * @param url
	 *             url
	 * @return  
	 */
	public static Bitmap loadImageFromUrl(String url) {
		URL m;
		InputStream i = null;
		try {
			m = new URL(url);
	        HttpURLConnection conn = (HttpURLConnection) m.openConnection();   
	        conn.setConnectTimeout(30 * 1000);   
	        conn.setRequestMethod("GET");   
	        i = conn.getInputStream();  
			
		} catch (MalformedURLException e1) {
			e1.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		Bitmap bitmap = BitmapFactory.decodeStream(i);
		// Drawable d = Drawable.createFromStream(i, "src");
		return bitmap;
	}

	public interface ImageCallback {
		public void imageLoaded(Bitmap imageBitmap, String imageUrl);
	}

}

getInstanceメソッドによってSingletonが得られ、loadDrawable(final String imageUrl、final ImageCallback imageCallback)メソッドが呼び出され、imageUrlはリソースのurlであり、imageCallbackは実装されるインタフェースである.このインタフェースのimageLoadedメソッドで画像のダウンロードが完了した後、画像の表示などの論理を実現する必要があります.
クラス内のimageCacheはダウンロードしたリソースをキャッシュし、同じurlリクエストがあればimageCacheから先に読み込みます