public interface ImageCache {
public Bitmap get(String url);
public void put(String url, Bitmap bmp);
}
/**
* 內存緩存MemoryCache類
*/
public class MemoryCache implements ImageCache{
private LruCache<String, Bitmap> mMemeryCache;
public MemoryCache(){
//初始化LRU緩存
}
@Override
public Bitmap get(String url) {
return mMemeryCache.get(url);
}
@Override
public void put(String url, Bitmap bmp) {
mMemeryCache.put(url, bmp);
}
}
/**
* SD卡緩存DiskCache類
*/
public class DiskCache implements ImageCache {
@Override
public Bitmap get(String url) {
return null;/*從本地文件中獲取該圖片*/
}
@Override
public void put(String url, Bitmap bmp) {
//講Bitmap寫入文件中
}
}
/**
*雙緩存DoubleCache類
*/
public class DoubleCache implements ImageCache {
ImageCache mMemoryCache = new MemoryCache();
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 bmp) {
mMemoryCache.put(url, bmp);
mDiskCache.put(url, bmp);
}
}
/**
* 圖片加載類
*/
public class ImageLoader {
//圖片緩存
ImageCache mImageCache = new MemoryCache();
//線程池,線程數量爲CPU的數量
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);
}
});
}
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){
e.printStackTrace();
}
return bitmap;
}
}
4.用戶可通過setImageCache(ImageCache cache)方法注入不同的緩存實現,不僅能使ImageLoader更簡單、健壯,也使得ImageLoader的可擴展性、靈活性更高。
ImageLoader imageLoader = new ImageLoader();
//使用內存緩存
imageLoader.setImageCache(new MemoryCache());
//使用SD卡緩存
imageLoader.setImageCache(new DiskCache());
//使用雙緩存
imageLoader.setImageCache(new DoubleCache());
//使用自定義的圖片緩存實現
imageLoader.setImageCache(new ImageCache(){
@Override
public void put(String url, Bitmap bmp){
//緩存圖片
}
@Override
public Bitmap get(String url){
return null;/*從緩存中獲取圖片*/
}
});
通過以上 代碼 可知MemoryCache、DiskCache、DoubleCache緩存圖片的具體實現完全不一樣,但是都實現了ImageCache接口。當用戶需要自定義實現緩存策略時,只需要新建一個實現ImageCache接口的類,然後構造該類的對象,並且通過setImageCache(ImageCache cache)注入到ImageLoader中,這樣ImageLoader就實現了千變萬化的緩存策略,且擴展這些緩存策略並不會導致ImageLoader類的修改。