Android之图片缓存

一、本地缓存类 ImageUtils
private static String path = Environment.getExternalStorageDirectory() + “/giftwash/images”;
//判断本地内存
public static boolean isMounted() {
return Environment.MEDIA_MOUNTED.equals(Environment
.getExternalStorageDirectory());
}
/**
* 保存图片方法
*
* @param url
* @param bitmap
*/
public static void saveImage(String url, Bitmap bitmap) {
if (!isMounted()) {
return;
}
File file = new File(path);
if (!file.exists()) {
file.mkdirs();
}
try {
bitmap.compress(Bitmap.CompressFormat.PNG, 100,
new FileOutputStream(new File(file, “” + url.hashCode())));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}

/**
 * 去图片方法
 *
 * @param url
 * @return
 */
public static Bitmap getImage(String url) {
    if (!isMounted())
        return null;
    File file = new File(path, "" + url.hashCode());
    if (file.exists()) {
        return BitmapFactory.decodeFile(file.getAbsolutePath());
    }
    return null;
}
二、重写ImageView
/**

* 下载及图片缓存
*/
public class CusImgeView extends ImageView implements MyDownUtils.OnDownCompelet {
private int defaultImg;//默认显示图片
public CusImgeView(Context context) {
super(context);
parseAttr(null);
}

public CusImgeView(Context context, AttributeSet attrs) {
    super(context, attrs);
    parseAttr(attrs);
}

/**
 * 自定义解析属性
 * @param attrs
 */
private void parseAttr(AttributeSet attrs) {
    TypedArray ta = getResources().obtainAttributes(attrs, R.styleable.cusImgeView);
    defaultImg = ta.getResourceId(R.styleable.cusImgeView_defaultImg,0);
    ta.recycle();
    this.setImageResource(defaultImg);
}
/**
 * 一级缓存
 */
private static LruCache<String, Bitmap> lruCache = new LruCache<String, Bitmap>(
        1024 * 1024 * 10) {
    @Override
    protected void entryRemoved(boolean evicted, String key,
                                Bitmap oldValue, Bitmap newValue) {
        super.entryRemoved(evicted, key, oldValue, newValue);
        if (evicted) {// 二级缓存
            mapCache.put(key, new SoftReference<Bitmap>(oldValue));
        }
    }

    @Override
    protected int sizeOf(String key, Bitmap value) {
        return value.getByteCount();
    }
};
/**
 * 二级缓存
 */
private static Map<String, SoftReference<Bitmap>> mapCache = new HashMap<String, SoftReference<Bitmap>>();
/**
 * 放入缓存
 *
 * @param url
 */
public static void addCache(String url, Bitmap bitmap) {
    if (bitmap != null) {
        lruCache.put(url, bitmap);// 存入缓存
        ImageUtils.saveImage(url,bitmap);
        // mapCache.put(url, new SoftReference<Bitmap>(bitmap));
    }
}
public static Bitmap getCache(String url){
    Bitmap bitmap = null;
    bitmap = lruCache.get(url);
    if(bitmap == null){
        if(mapCache.containsKey(url)){
            SoftReference<Bitmap> soft = mapCache.get(url);
            bitmap = soft.get();
            if(bitmap != null){
                lruCache.put(url,bitmap);//放到一级缓存中去
                mapCache.remove(url);//移除该图片
            }
        }
    }
    if(bitmap == null){
        //到本地区拿
        bitmap = ImageUtils.getImage(url);
        if(bitmap!=null)
            lruCache.put(url,bitmap);
    }
    return bitmap;
}

/**
 * 获取图片调用方法
 * @param url
 */
public void setUrl(String url){
    if(defaultImg!=0) {
        this.setImageResource(defaultImg);
    }
    setTag(url);
    Bitmap bitmap = getCache(url);
    if(bitmap == null)
        //new SortImgAsync(AppUtils.getContext(),this,url);
        MyDownUtils.downBitmap(url,this);
    else
        setImageBitmap(bitmap);
}

@Override
public void downSucc(String url, Object obj) {
    Bitmap bitmap = null;
    if(obj!=null && url.equals(getTag())) {
        bitmap = (Bitmap) obj;
        setImageBitmap(bitmap);
        addCache(url, bitmap);
    }
}

}
三、在布局添加载重写之后的ImageView,调用setUrl便可加载图片

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值