实现简单的ImageLoader

来源:互联网 发布:淘宝美工素材网站 编辑:程序博客网 时间:2024/05/21 12:46

Android开发中经常会对图片进行处理,图片如何加载和缓存的实现有难有易,这里实现一个简单的ImageLoader,只是简述其中的基本原理。

我有几张阿里云幸运券分享给你,用券购买或者升级阿里云相应产品会有特惠惊喜哦!把想要买的产品的幸运券都领走吧!快下手,马上就要抢光了。

整个实现需要用到图片的缓存和加载,首先需要实现图片的缓存。Android手机缓存又分别可以用到内存和sd卡,内存实现ImageCache

 

public class ImageCache {LruCache<String, Bitmap> mImageCache;public ImageCache() {// TODO Auto-generated constructor stubinitImageCache();}private void initImageCache() {// 计算可使用的最大内存final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);// 取四分之一的可用内存作为缓存final int cacheSize = maxMemory / 4;mImageCache = new LruCache<String, Bitmap>(cacheSize) {protected int sizeOf(String key, Bitmap bitmap) {return bitmap.getRowBytes() * bitmap.getHeight() / 1024;};};}public void put(String url, Bitmap bitmap) {mImageCache.put(url, bitmap);}public Bitmap get(String url) {return mImageCache.get(url);}}


DiskCache类实现图片缓存到SD卡中

 

public class DiskCache {static String cacheDir = "sd卡的路径";// 从缓存中获取图片public Bitmap get(String url) {return BitmapFactory.decodeFile(cacheDir + url);}// 将图片缓存到内存中public void put(String url, Bitmap bitmap) {FileOutputStream fileOutputStream = null;try {fileOutputStream = new FileOutputStream(cacheDir + url);bitmap.compress(CompressFormat.PNG, 100, fileOutputStream);} catch (Exception e) {// TODO: handle exception} finally {if (fileOutputStream!=null) {try {fileOutputStream.close();} catch (Exception e2) {// TODO: handle exception}}}}}


最后在ImageLoader类中分别实现两个缓存:

 

public class ImageLoader {// 图片缓存 内存缓存ImageCache mImageCache = new ImageCache();// SD卡缓存DiskCache mDiskCache = new DiskCache();// 是否使用SD卡缓存boolean isUseDiskCache = false;// 线程池,线程数量为CPU数量ExecutorService mExecutorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());public void displayImage(final String url, final ImageView imageView) {Bitmap bitmap = isUseDiskCache ? mDiskCache.get(url) : mImageCache.get(url);if (bitmap != null) {imageView.setImageBitmap(bitmap);return;}imageView.setTag(url);mExecutorService.submit(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubBitmap bitmap = downloadImage(url);if (bitmap == null) {return;}if (imageView.getTag().equals(url)) {imageView.setImageBitmap(bitmap);}mImageCache.put(url, bitmap);}});}public Bitmap downloadImage(String imageUrl) {Bitmap bitmap = null;try {URL url = new URL(imageUrl);final HttpURLConnection conn = (HttpURLConnection) url.openConnection();bitmap = BitmapFactory.decodeStream(conn.getInputStream());conn.disconnect();} catch (Exception e) {// TODO: handle exception}return bitmap;}public void useDiskCache(boolean useDiskCache) {isUseDiskCache = useDiskCache;}}

阅读原文http://click.aliyun.com/m/34567/

原创粉丝点击