1缓存类的功能
/**
* 缓存功能
*/
public interface ImageCache {
public void put(String url, Bitmap bitmap);
public Bitmap get(String url);
}
2 内存缓存
/**
* 内存缓存
*/
public class MemeryCache implements ImageCache {
private LruCache<String, Bitmap> mMemeryCache;
public MemeryCache() {
//最大内存
int maxMemery = (int) (Runtime.getRuntime().maxMemory() / 1024);
//取1/4 的可用内存作为缓存
final int cacheSize = maxMemery / 4;
mMemeryCache = new LruCache<String, Bitmap>(cacheSize){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes() * value.getHeight() / 1024;
}
};
}
@Override
public void put(String url, Bitmap bitmap) {
mMemeryCache.put(url,bitmap);
}
@Override
public Bitmap get(String url) {
return mMemeryCache.get(url);
}
}
3 磁盘缓存
/**
* sd卡存储
*/
public class DiskCache implements ImageCache {
static String cacheDir = "sdcard/cache/";
@Override
public void put(String url, Bitmap bitmap) {
FileOutputStream fos = null;
try {
fos = new FileOutputStream(cacheDir + url);
bitmap.compress(Bitmap.CompressFormat.PNG,100,fos);
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
if (fos != null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
@Override
public Bitmap get(String url) {
return BitmapFactory.decodeFile(cacheDir + url);
}
}
4 双缓存
/**
* 双缓存
*/
public class DoubleCache implements ImageCache {
ImageCache mMermeryCache = new MemeryCache();
ImageCache mDisCache = new DiskCache();
@Override
public void put(String url, Bitmap bitmap) {
mMermeryCache.put(url,bitmap);
mDisCache.put(url,bitmap);
}
@Override
public Bitmap get(String url) {
Bitmap bitmap = mMermeryCache.get(url);
if (bitmap == null){
bitmap = mDisCache.get(url);
}
return bitmap;
}
}
5 ImageLoader
/**
* imageView 通过url展示图片
*/
public class ImageLoader {
ImageCache mImageCache = new MemeryCache();
//线程池,线程数量为CPU数量
ExecutorService mExecutorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
public void setImgeCache(ImageCache imgeCache){
this.mImageCache = imgeCache;
}
public void displayImage(String url, ImageView imageView){
Bitmap bitmap = mImageCache.get(url);
if (bitmap != null){
imageView.setImageBitmap(bitmap);
}
//没有缓存--下载
submitLoadRequest(url,imageView);
}
private void submitLoadRequest(String imageUrl,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);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
bitmap = BitmapFactory.decodeStream(connection.getInputStream());
connection.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}
}
6 使用
/**
* 使用
*/
public class User {
public void use(){
ImageLoader imageLoader = new ImageLoader();
//设置缓存类型
imageLoader.setImgeCache(new DoubleCache());
//自定义缓存
imageLoader.setImgeCache(new ImageCache() {
@Override
public void put(String url, Bitmap bitmap) {
}
@Override
public Bitmap get(String url) {
return null;
}
});
}
}