,首先定义个工具类:
/* * 异步的任务 ,接受的参数是 要下载图片的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); }