Android 缓存机制代码(软引用)

package com.google.softreference;
//软引用加载图片,防止内存溢出
public class ImageSoftReference {
private Object lock = new Object();
private boolean mAllowLoad = true;
//是否第一次加载
private boolean firstLoad = true;
final Handler handler = new Handler();
// 缓存
private HashMap<String, SoftReference<Drawable>> imageCache = new HashMap<String, SoftReference<Drawable>>();

//  加载图片
public void loadImage(Integer t, String imageUrl, OnImageLoadListener listener) {
final OnImageLoadListener mListener = listener;
final String mImageUrl = imageUrl;
final Integer mt = t;
new Thread(new Runnable() {
@Override
public void run() {
if (!mAllowLoad) {
synchronized (lock) {
 try {
   lock.wait();
} catch (InterruptedException e) {
  e.printStackTrace();
  }
 }
}
if (mAllowLoad && firstLoad) {
    loadImage(mImageUrl, mt, mListener);
    }
   }
 }).start();
}
//加载图片方法
private void loadImage(final String mImageUrl, final Integer mt, final OnImageLoadListener mListener) {
// 先判断引用中是否缓存了图片
if (imageCache.containsKey(mImageUrl)) {
SoftReference<Drawable> softReference = imageCache.get(mImageUrl);
final Drawable d = softReference.get();
if (d != null) {
handler.post(new Runnable() {
 @Override
 public void run() {
 if (mAllowLoad) {
    mListener.onImageLoad(mt, d);
   }
  }
 });
 return;
 }
}
// 如果没有,缓存SDcard
try {
final Drawable d = loadImageFromUrl(mImageUrl);
if (d != null) {
imageCache.put(mImageUrl, new SoftReference<Drawable>(d));
}
handler.post(new Runnable() {
@Override
public void run() {
if (mAllowLoad) {
    mListener.onImageLoad(mt, d);
    }
  }
});
} catch (Exception e) {
handler.post(new Runnable() {
@Override
public void run() {
      mListener.onError(mt);
    }
});
  e.printStackTrace();
  }
}
// SDcard缓存
public static Drawable loadImageFromUrl(String url) {
URL m;  
        InputStream i = null;  
        Drawable d = null;
        try {  
            m = new URL(url);  
            i = (InputStream) m.getContent();  
            d = Drawable.createFromStream(i, "src");  
        } catch (MalformedURLException e1) {  
            e1.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        } catch (Exception e){
        e.printStackTrace();
        }
        return d; 
}
// 回调接口
public interface OnImageLoadListener {
public void onImageLoad(Integer t, Drawable drawable);
public void onError(Integer t);
    }

}

调用就好办了,在页面相应的控件调用就好!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值