图片异步加载和图片缓存的两种方式
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); }
相关文章推荐
- 图片异步加载和图片缓存的两种方式
- ListView的常见优化:获取网络图片异步加载,分批加载,分页显示,图片缓存等优化方式
- ListView的常见优化:获取网络图片异步加载,分批加载,分页显示,图片缓存等优化方式
- ListView优化,获取网络图片异步加载,分批加载,分页显示,图片缓存等优化方式
- ListView的常见优化:获取网络图片异步加载,分批加载,分页显示,图片缓存等优化方式
- Android实战简易教程<四十九>(两种方式实现网络图片异步加载)
- SDWebImage-图片自动缓存、异步加载实用库(转贴)
- Android 异步加载图片,使用LruCache和SD卡或手机缓存,效果非常的流畅
- android开发--ListView+Json+异步网络图片加载+滚动翻页的例子(图片能缓存,图片不错乱)
- Android异步加载图片详解之方式一(1)
- android图片异步加载缓存2(1运行不了但是代码很优雅)
- Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比
- iOS网络编程(三) 异步加载及缓存图片---->SDWebImage
- 常用图片加载两种方式
- Android图片异步加载与本地缓存的实现
- SDWebImage异步加载图片及缓存
- Android ListView 图片异步加载和图片内存缓存机制
- android图片的异步加载和双缓存学习笔记——DisplayImageOptions