今天遇到一个问题,ImageContainer一直重复添加。就下拉了几页,图片数据多了好几倍。我在想,假如我要一直下拉查看图片,会不会报out of memory(OOM)。
原来代码:
<span style="white-space:pre"> </span>private List<ImageContainer> mImageContainers = new ArrayList<ImageLoader.ImageContainer>();
<span style="white-space:pre"> </span>ImageContainer container = mImageLoader.get(url, listener,
Tools.converToCompatiblePx(mParentActivity, 790),
Tools.converToCompatiblePx(mParentActivity, 340));
if(!mImageContainers.contain(container))
<span style="white-space:pre"> </span>mImageContainers.add(container);
<span style="white-space:pre"> </span>//回收图片缓存
<span style="white-space:pre"> </span>for (ImageContainer container : mImageContainers) {
container.cancelRequest();
String url = container.getRequestUrl();
if (url.contains(Constants.HOST)) {
url = url.replace(Constants.HOST, "");
}
ImageView imageView = (ImageView) mImageLinearLayout
.findViewWithTag(url);
if (imageView != null) {
imageView.setImageDrawable(null);
}
if (container.getBitmap() != null) {
container.getBitmap().recycle();
}
}
<span style="white-space:pre"> </span>mImageContainers.clear();
修改后代码:
<span style="white-space:pre"> </span>private HashMap<String,ImageContainer> mImageContainers = new HashMap<>();
<span style="white-space:pre"> </span>ImageContainer container = mImageLoader.get(url, listener,
Tools.converToCompatiblePx(mParentActivity, 790),
Tools.converToCompatiblePx(mParentActivity, 340));
boolean contain = mImageContainers.containsKey(container.getRequestUrl());
if(!contain)
mImageContainers.put(container.getRequestUrl(),container);
<span style="white-space:pre"> </span>//回收图片缓存
<span style="white-space:pre"> </span>List<HashMap<String,ImageContainer>> list = new ArrayList<HashMap<String,ImageContainer>>();
list.add(mImageContainers);
for (Map<String,ImageContainer> map : list){
for (String k : map.keySet()) {
ImageContainer container = map.get(k);
container.cancelRequest();
String url = container.getRequestUrl();
if (url.contains(Constants.HOST)) {
url = url.replace(Constants.HOST, "");
}
ImageView imageView = (ImageView) mImageLinearLayout
.findViewWithTag(url);
if (imageView != null) {
imageView.setImageDrawable(null);
}
if (container.getBitmap() != null) {
container.getBitmap().recycle();
}
}
}
mImageContainers.clear();