android非同期ダウンロード画像


SyncImageLoaderピクチャ非同期ダウンロードツールクラス
package mars.async.down.utils;

import java.lang.ref.SoftReference;
import java.net.URL;
import java.util.HashMap;

import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;

public class SyncImageLoader {
	private HashMap<String, SoftReference<Drawable>> imageCache = new HashMap<String, SoftReference<Drawable>>();

	//   URL        ,  Drawable  
	public Drawable loadImageFormUrl(String imageUrl) {
		try {
			return Drawable.createFromStream(new URL(imageUrl).openStream(),
					"src");
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}

	public Drawable loadDrawable(final String imageUrl,
			final ImageCallback imageCallback) {
		//         imageUrl      
		if (imageCache.containsKey(imageUrl)) {
			SoftReference<Drawable> softReference = imageCache.get(imageUrl);
			if (softReference.get() != null) {
				return softReference.get();
			}
		}

		final Handler handler = new Handler() {

			@Override
			public void handleMessage(Message msg) {
				imageCallback.imageLoaded((Drawable) msg.obj);
			}

		};

		//         ,          
		new Thread() {

			@Override
			public void run() {
				//        
				Drawable drawable = loadImageFormUrl(imageUrl);
				imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));
				Message msg = handler.obtainMessage(0, drawable);
				handler.sendMessage(msg);
			}

		}.start();

		return null;
	}

	//     ,            
	public interface ImageCallback {
		public void imageLoaded(Drawable imageDrawable);
	}

}

CallbackImplementsコールバックインタフェース実装クラス.
package mars.async.down.utils;

import android.graphics.drawable.Drawable;
import android.widget.ImageView;

public class CallbackImplements implements SyncImageLoader.ImageCallback {

	private ImageView imageView;

	public CallbackImplements(ImageView imageView) {
		super();
		this.imageView = imageView;
	}

	@Override
	public void imageLoaded(Drawable imageDrawable) {
		imageView.setImageDrawable(imageDrawable);
	}

}

Activityで呼び出す
package mars.async.down;

import mars.async.down.utils.CallbackImplements;
import mars.async.down.utils.SyncImageLoader;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.ImageView;

public class MainActivity extends Activity {
	private SyncImageLoader syncImageLoader = new SyncImageLoader();

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		loadImage("http://www.android.com/images/icon-partners.png",
				R.id.imageView1);
		loadImage("http://www.android.com/images/icon-dev.png", R.id.imageView2);
		loadImage("http://www.android.com/images/icon-market.png",
				R.id.imageView3);
	}

	// url:   url  
	// id:ImageView   ID
	private void loadImage(String url, int id) {
		ImageView imageView = (ImageView) findViewById(id);
		CallbackImplements callbackImplements = new CallbackImplements(
				imageView);
		Drawable cacheImage = syncImageLoader.loadDrawable(url,
				callbackImplements);
		//         ,      image.      callback    
		if (cacheImage != null) {
			imageView.setImageDrawable(cacheImage);
		}
	}

}