- 当缓存相关的逻辑需要改变时,不需要改变ImageLoader类,而图片加载的逻辑需要修改时,也不会影响到缓存处理逻辑(单一模式)。
- 加一个SD卡缓存功能:首先优先使用内存缓存,如果内存缓存没有图片,再使用SD卡的缓存,如果SD卡缓存也不存在,从网络上获取(开闭原则)。
package com.example.myimageloader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.widget.ImageView;
public class ImageLoader {
ImageCache mImageCache = new ImageCache();
ExecutorService mExcutorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
public void displayImage(final String url, final ImageView imageView) {
Bitmap bitmap = mImageCache.get(url);
if(bitmap!=null){
imageView.setImageBitmap(bitmap);
return;
}
imageView.setTag(url);
mExcutorService.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);
}
});
}
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;
}
}
package com.example.myimageloader;
import android.graphics.Bitmap;
import android.support.v4.util.LruCache;
public class ImageCache {
LruCache<String, Bitmap> mImageCache;
public ImageCache() {
initImageCache();
}
private void initImageCache() {
final int maxMemory = (int) Runtime.getRuntime().maxMemory() / 1024;
final int cacheSize = maxMemory / 4;
mImageCache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
// TODO Auto-generated method stub
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);
}
}
“`