思路:展示一张图片, 先从内存(Lurcache容器)中查找,如果有 从内存中取出展示;没有 再到SD卡中查找,SD卡中有就从SD卡中取出展示,如果都没有 就从网络上下载,保存到内存和SD卡。
//图片加载器
public class ImageLoader {
//图片缓存(默认缓存)
private ImageCache mImageCache = new DoubleCache();
//线程池,数量为CPU的数量
private ExecutorService mExecutorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
//注入缓存实现
public void setImageCache(ImageCache cache) {
mImageCache = cache;
}
public void displayImage(final String imageUrl, final ImageView imageView) {
Bitmap bitmap = mImageCache.get(imageUrl);
if (bitmap != null) {
imageView.setImageBitmap(bitmap);
return;
}
//图片没缓存,提交到线程池中下载图片
submitLoadRequest(imageUrl, imageView);
}
private void submitLoadRequest(final String imageUrl, final ImageView imageView) {
imageView.setTag(imageUrl);
mExecutorService.submit(new Runnable() {
@Override
public void run() {
Bitmap bitmap = downloadImage(imageUrl);
if (bitmap == null) {
return;
}
if (imageView.getTag().equals(imageUrl)) {
imageView.setImageBitmap(bitmap);
}
mImageCache.put(imageUrl, bitmap);
}
});
}
private Bitmap downloadImage(String imageUrl) {
Bitmap bitmap = null;
try {
URL url = new URL(imageUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
bitmap = BitmapFactory.decodeStream(conn.getInputStream());
conn.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
}
//图片缓存接口
public interface ImageCache {
//从缓存中取出图片
Bitmap get(String url);
//将图片put入缓存中
void put(String url, Bitmap bitmap);
}
//内存加载
public class MemoryCache implements ImageCache{
private LruCache<String, Bitmap> mMemoryCache;
//初始化LRU缓存
public MemoryCache(){
initImageCache();
}
private void initImageCache(){
//计算可用的最大内存
int maxMemory = (int)(Runtime.getRuntime().maxMemory() / 1024);
//取四分之一可用内存作缓存
int cacheSize = maxMemory / 4;
mMemoryCache = new LruCache<String, Bitmap>(cacheSize){
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getRowBytes() * bitmap.getHeight() / 1024;
}
};
}
@Override
public Bitmap get(String url) {
return mMemoryCache.get(url);
}
@Override
public void put(String url, Bitmap bitmap) {
mMemoryCache.put(url, bitmap);
}
}
//内存缓存
public class DiskCache implements ImageCache {
private static String cacheDir = "sdcard/cache/";
//从本地获取该图片
@Override
public Bitmap get(String url) {
return BitmapFactory.decodeFile(cacheDir + url);
}
//将bitmap写入文件中
@Override
public void put(String url, Bitmap bitmap) {
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(cacheDir + url);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (fileOutputStream != null) {
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
//双缓存DoubleCache类
public class DoubleCache implements ImageCache {
private ImageCache mMemoryCache = new MemoryCache();
private ImageCache mDiskCache = new DiskCache();
//先从内存中获取图片,如果没有,再从SD卡中获取
@Override
public Bitmap get(String url) {
Bitmap bitmap = mMemoryCache.get(url);
if (bitmap == null){
bitmap = mDiskCache.get(url);
}
return bitmap;
}
//将图片缓存到内存和SD卡中
@Override
public void put(String url, Bitmap bitmap) {
mMemoryCache.put(url, bitmap);
mDiskCache.put(url, bitmap);
}
}
摘录自:Android源码设计模式解析与实战。