,首先定义个工具类:
/*
* 异步的任务 ,接受的参数是 要下载图片的url
* 返回值 是这个图片 的bitMap
*/
public class LoadImageAsyncTask extendsAsyncTask<String, Void, Bitmap> {
// 定义一个接口 ,接口里面包含了几个需要实现的方法
// 谁调用 LoadImageAsyncTask 就必须实现这个接口里面定义的方法
privateLoadImageCallback loadImageCallback;
//因为LoadImageAsyncTask 没有默认的空参数的构造方法
publicLoadImageAsyncTask(LoadImageCallback loadImageCallback) {
this.loadImageCallback = loadImageCallback;
}
publicinterface LoadImageCallback{
//当图片被加载上来需要执行的方法
voidonImageLoaded(Bitmap bitmap);
// 在图片下载之前需要执行的方法
voidbeforeImageLoaded();
}
<span data-mce-="">// 在后台运行 非ui线程 </span>
// 可变长度的参数 其实就是 parms的数组
@Override
protectedBitmap doInBackground(String... params) {
try{
//获取可变长度参数的第一个参数的string 代表的是 图片的地址
String iconpath = params[0];
URL url =new URL(iconpath);
URLConnection conn = url.openConnection();
Bitmap bitmap = BitmapFactory.decodeStream(conn.getInputStream());
returnbitmap;
}catch (Exception e) {
e.printStackTrace();
returnnull;
}
}
// 后台任务执行前的操作
<span data-mce-="">//运行在ui线程中的</span>
@Override
protectedvoid onPreExecute() {
loadImageCallback.beforeImageLoaded();
super.onPreExecute();
}
// 后台任务执行完毕后的操作
<span data-mce-="">// 运行在ui线程中</span>
@Override
protectedvoid 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(
newLoadImageCallback() {
publicvoid onImageLoaded(Bitmap bitmap) {
iv_book.setImageBitmap(bitmap);
// <span data-mce-="">保存到sd卡上</span> 缓存方式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(); }
*/
// <span data-mce-="">把图片保存到内存中</span> 缓存方式2
map.put(iconname,new <span data-mce-="">SoftReference</span><Bitmap>(
bitmap));
Log.i("MyReadActivity","把图片存放到内存缓存中 ");
}
publicvoid beforeImageLoaded() {
iv_book.setImageResource(R.drawable.book);
Log.i("MyReadActivity","下载服务器图片 ");
}
});
// 异步的从服务器上下载图片
task.execute(path);
}