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);
}
//软引用加载图片,防止内存溢出
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);
}
}
调用就好办了,在页面相应的控件调用就好!