您的位置:首页 > 其它

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

2012-02-17 17:09 381 查看
,首先定义个工具类:

/**
* 异步的任务 ,接受的参数是 要下载图片的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);
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: