缓存接口
ImageCache:
public interface ImageCache{ public Bitmap get(String url); public void put(String url,Bitmap bitmap);}复制代码
内存缓存
MemoryCache:
public class MemoryCache implements ImageCache{ private LruCachemMemoryCache; public MemoryCache() { initImageCache(); } private void initImageCache() { //计算可使用的最大内存 final int maxMemory = (int)(Runtime.getRuntime().maxMemory() / 1024); //取1/4作为缓存 final int cacheSize = maxMemory / 4; mMemoryCache = new LruCache (cacheSize) { @Override protected int sizeOf(String key, Bitmap value) { return value.getRowBytes() * value.getHeight() / 4; } }; } @Override public Bitmap get(String url) { return mMemoryCache.get(url); } @Override public void put(String url, Bitmap bitmap) { mMemoryCache.put(url,bitmap); }}复制代码
磁盘缓存
DiskCache :
public class DiskCache implements ImageCache{ static String cacheDir = "sdcard/cache/"; @Override public Bitmap get(String url) { return BitmapFactory.decodeFile(cacheDir+url); } @Override public void put(String url, Bitmap bmp) { FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream(cacheDir + url); bmp.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream); } catch(Exception e) { e.printStackTrace(); } finally { CloseUtils.closeQuitely(fileOutputStream); if(fileOutputStream != null) { try { fileOutputStream.close(); } catch(IOException e) { e.printStackTrace(); } } } }}复制代码
流工具
CloseUtils:
public class CloseUtils{ private CloseUtils(){} /** * 关闭closeable对象 * @param closeable */ public static void closeQuitely(Closeable closeable){ if(closeable != null){ try { closeable.close(); } catch(IOException e) { e.printStackTrace(); } } }}复制代码
双缓存实现
DoubleCache :
/** * 双缓存,获取图片先从内存,内存没有在从sdcard获取 * 缓存时在内存和sdcard各缓存一份 */public class DoubleCache implements ImageCache{ private MemoryCache mMemoryCache = new MemoryCache(); private DiskCache mDiskCache = new DiskCache(); @Override public Bitmap get(String url) { Bitmap bitmap = mMemoryCache.get(url); if(bitmap == null){ bitmap = mDiskCache.get(url); } return bitmap; } @Override public void put(String url, Bitmap bitmap) { mMemoryCache.put(url,bitmap); mDiskCache.put(url,bitmap); }}复制代码
图片加载器的实现
ImageLoader:
public class ImageLoader{ //内存缓存 private ImageCache mImageCache = new MemoryCache(); //线程池,个数为cpu的数量 private ExecutorService mExecutorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); /** * 注入缓存实现 * @param cache */ public void setImageCache(ImageCache cache){ this.mImageCache = cache; } //加载图片 public void displayImage(String url, ImageView imageView){ Bitmap bitmap = mImageCache.get(url); if(bitmap != null){ imageView.setImageBitmap(bitmap); return; } //没有缓存提交到线程池下载图片 submitLoadRequest(url,imageView); } private void submitLoadRequest(final String url, final ImageView imageView) { imageView.setTag(url); mExecutorService.submit(new Runnable() { @Override public void run() { Bitmap bitmap = downloadImage(url); if(bitmap == null){ return; } if(imageView.getTag().equals(url)){ imageView.setImageBitmap(bitmap); } mImageCache.put(url,bitmap); } }); } /** * 下载图片 * @param imageUrl * @return */ private Bitmap downloadImage(String imageUrl) { Bitmap mBitmap = null; try { URL url = new URL(imageUrl); final HttpURLConnection conn = (HttpURLConnection)url.openConnection(); mBitmap = BitmapFactory.decodeStream(conn.getInputStream()); conn.disconnect(); } catch(Exception e) { e.printStackTrace(); } return mBitmap; }}复制代码