Aync Taskは非同期で画像をダウンロードします。


もっと読む
この例はAyncTaskを利用して画像を非同期的にダウンロードし、ダウンロードする時はまずネット画像を地元のcacheディレクトリにダウンロードして保存し、imgUrlの画像ファイル名で保存します。同名のファイルがあればcacheディレクトリからローカルにロードします。
レイアウトファイルは、まず画像でビットを占めます。

  

        private Context context = AsyncTaskDemo.this;
	private ImageView image;
	//    
	private String imageUrl = "http://dl.iteye.com/upload/attachment/0080/1571/2b9a099a-0a7b-3a60-909e-97a8316716cb.jpg";

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.asynctask);
		getWidget();
		loadImage(imageUrl);
	}

	/**      */
	public void getWidget() {
		image = (ImageView) findViewById(R.id.image);
	}

	private void loadImage(final String imageUrl) {
		ImageAsyncLoader asyncImageLoader = new ImageAsyncLoader();
		//       
		Drawable cachedImage = asyncImageLoader.loadDrawable(context, imageUrl, new ImageCallback() {
			public void imageLoaded(Drawable imageDrawable, String imageUrl) {
		if (imageDrawable != null) {
	image.setImageDrawable(ImageAsyncLoader.zoomDrawable(imageDrawable, ImageAsyncLoader.dip2px(context, 150), ImageAsyncLoader.dip2px(context, 150)));
				}
			}
		});
		if (cachedImage != null) {image.setImageDrawable(ImageAsyncLoader.zoomDrawable(cachedImage, ImageAsyncLoader.dip2px(context, 150), ImageAsyncLoader.dip2px(context, 150)));
		}
	}
画像非同期ローディング:

/**
	 * SoftReference               。
	 *            ,         ,          ,        。 
	 *    ,           Java  OutOfMemory     ,    null。
	 *                  ,  Cache   ,               OutOfMemory。
	 */
	private HashMap> cacheMap = null;
	private BlockingQueue queue = null;
	private ThreadPoolExecutor executor = null;
	
	public interface ImageCallback {
		public void imageLoaded(Drawable imageDrawable, String imageUrl);
	}
	
	public ImageAsyncLoader() {
		cacheMap = new HashMap>();
		/**
		 *           、      blocking queue。
		 *      FIFO(    )    。
		 *                   。
		 *                   。
		 *            ,                    。
		 *                     ,             ,         。
		 */
		queue = new LinkedBlockingQueue();
		/**
		 *             2 
* 10
* 180 */ executor = new ThreadPoolExecutor(2, 10, 180, TimeUnit.SECONDS, queue); } public Drawable loadDrawable(final Context context, final String imageUrl, final ImageCallback imageCallback) { if (cacheMap.containsKey(imageUrl)) { SoftReference softReference = cacheMap.get(imageUrl); Drawable drawable = softReference.get(); if (drawable != null) { return drawable; } } final Handler handler = new Handler() { public void handleMessage(Message message) { imageCallback.imageLoaded((Drawable) message.obj, imageUrl); } }; // executor.execute(new Runnable() { public void run() { // URL Drawable drawable = loadImageFromUrl(context, imageUrl); // if (null != drawable) cacheMap.put(imageUrl, new SoftReference(drawable)); Message message = handler.obtainMessage(0, drawable); handler.sendMessage(message); } }); return null; } // cache , imagUrl , cache public static Drawable loadImageFromUrl(Context context, String imageUrl) { Drawable drawable = null; if (imageUrl == null) return null; String fileName = ""; // url if (imageUrl != null && imageUrl.length() != 0) { fileName = imageUrl.substring(imageUrl.lastIndexOf("/") + 1); } // ( : ) File file = new File(context.getCacheDir(), fileName); // if (!file.exists() && !file.isDirectory()) { try { // FileOutputStream fos = new FileOutputStream(file); InputStream is = new URL(imageUrl).openStream(); int data = is.read(); while (data != -1) { fos.write(data); data = is.read(); } fos.close(); is.close(); drawable = Drawable.createFromPath(file.toString()); } catch (IOException e) { e.printStackTrace(); } } // else { drawable = Drawable.createFromPath(file.toString()); } return drawable; }
常用画像の処理方法:

/**
	 *   Drawable
	 * 
	 * @param drawable
	 * @param w      
	 * @param h      
	 * @return Drawable
	 */
	public static Drawable zoomDrawable(Drawable drawable, int w, int h) {
		int width = drawable.getIntrinsicWidth();
		int height = drawable.getIntrinsicHeight();
		// drawable   bitmap
		Bitmap oldbmp = drawableToBitmap(drawable);
		//         Matrix  
		Matrix matrix = new Matrix();
		//       
		float scaleWidth = ((float) w / width);
		float scaleHeight = ((float) h / height);
		matrix.postScale(scaleWidth, scaleHeight);
		//       
		Bitmap newbmp = Bitmap.createBitmap(oldbmp, 0, 0, width, height, matrix, true);
		return new BitmapDrawable(newbmp);
	}

	/**
	 *  drawable   bitmap
	 * 
	 * @param drawable
	 * @return Bitmap
	 */
	private static Bitmap drawableToBitmap(Drawable drawable) {
		//  drawable   
		int width = drawable.getIntrinsicWidth();
		int height = drawable.getIntrinsicHeight();
		Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565; //  drawable     

		Bitmap bitmap = Bitmap.createBitmap(width, height, config);
		Canvas canvas = new Canvas(bitmap);
		drawable.setBounds(0, 0, width, height);
		drawable.draw(canvas);
		return bitmap;
	}

	/**
	 *     :dip => px
	 * 
	 * @param ctx      
	 * @param dipValue
	 * @return
	 */
	public static int dip2px(Context ctx, int dipValue) {
		final float scale = ctx.getResources().getDisplayMetrics().density;
		return (int) (dipValue * scale);
	}
設定ファイル: