图片异步加载和图片缓存的两种方式

,首先定义个工具类:

/**
 * 异步的任务 ,接受的参数是 要下载图片的url 
 * 返回值 是这个图片 的bitMap
 */
public class LoadImageAsyncTask extends AsyncTask<String, Void, Bitmap> {

	// 定义一个接口 ,接口里面包含了几个需要实现的方法 
	// 谁调用 LoadImageAsyncTask 就必须实现这个接口里面定义的方法  
	private LoadImageCallback loadImageCallback;
	
	
	//因为LoadImageAsyncTask 没有默认的空参数的构造方法  
	public LoadImageAsyncTask(LoadImageCallback loadImageCallback) {
		this.loadImageCallback = loadImageCallback;
	}

	public interface LoadImageCallback{
		//当图片被加载上来需要执行的方法 
		void onImageLoaded(Bitmap bitmap);
		// 在图片下载之前需要执行的方法 
		void beforeImageLoaded();
	}
	
	// 在后台运行 非ui线程  
	// 可变长度的参数  其实就是 parms的数组 
	@Override
	protected Bitmap doInBackground(String... params) {
		try {
			//获取可变长度参数的第一个参数的string 代表的是 图片的地址 
			String iconpath = params[0];
			URL url = new URL(iconpath);
			URLConnection conn = url.openConnection();
			Bitmap bitmap = BitmapFactory.decodeStream(conn.getInputStream());
			return bitmap;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	// 后台任务执行前的操作
	//运行在ui线程中的
	@Override
	protected void onPreExecute() {
		loadImageCallback.beforeImageLoaded();
		super.onPreExecute();
	}

	// 后台任务执行完毕后的操作
	// 运行在ui线程中 
	@Override
	protected void onPostExecute(Bitmap result) {
		super.onPostExecute(result);
		// 需要把bitmap 设置到某个控件上  
		loadImageCallback.onImageLoaded(result);
	}
}
AsyncTask<Params, Progress, Result>泛型里面的参数是可以改变的,如这个工具类第一个参数就是图片的路径,第二个参数就是执行的进度,第三个参数是返回是BitMap
if (map.containsKey(iconname)) {
				// 如果map集合中存在软引用的对象
				SoftReference<Bitmap> obj = map.get(iconname);
				Bitmap bitmap = obj.get();
				iv_book.setImageBitmap(bitmap);
				Log.i("MyReadActivity", "使用内存缓存");
			} else {
				LoadImageAsyncTask task = new LoadImageAsyncTask(
						new LoadImageCallback() {
							public void onImageLoaded(Bitmap bitmap) {
								iv_book.setImageBitmap(bitmap);
								// 保存到sd卡上  缓存方式1
								/*
								 * try { File file = new File(Environment
								 * .getExternalStorageDirectory(), "/image" +
								 * iconname); FileOutputStream fos = new
								 * FileOutputStream( file); // 把内存中的图片保存到了sd卡中
								 * bitmap.compress(CompressFormat.JPEG, 100,
								 * fos); } catch (Exception e) {
								 * e.printStackTrace(); }
								 */
								// 把图片保存到内存中  缓存方式2
								map.put(iconname, new SoftReference<Bitmap>(
										bitmap));
								Log.i("MyReadActivity", "把图片存放到内存缓存中 ");
							}

							public void beforeImageLoaded() {
								iv_book.setImageResource(R.drawable.book);
								Log.i("MyReadActivity", "下载服务器图片 ");
							}
						});
				// 异步的从服务器上下载图片
				task.execute(path);
			}

  

posted @ 2012-02-17 17:09  johnny901114  阅读(607)  评论(0编辑  收藏  举报