我创建了一个类,其任务是将相应的图像与相应的ImageVew相匹配。
不幸的是,这会导致内存泄漏...
正如stackoverflow上有人在类似问题中提出的那样,我将图像从Resources转换为Bitmaps。
我的班级看起来像这样:
public ImageAdjuster(Context context, ImageView iv1,
ImageView iv2, ImageView iv3, ImageView iv4, ImageView iv5,
ImageView iv6, ImageView iv7) {
this.iv1 = iv1;
this.iv2 = iv2;
this.iv3 = iv3;
this.iv4 = iv4;
this.iv5 = iv5;
this.iv6 = iv6;
this.iv7 = iv7;
this.context = context;
loadAllDrawables();
}
private void loadAllDrawables() {
imageResourceMap = new HashMap<String, Integer>();
imageResourceMap.put("image1", R.drawable.image1);
imageResourceMap.put("image2", R.drawable.image2);
imageResourceMap.put("image3", R.drawable.image3);
imageResourceMap.put("image4", R.drawable.image4);
imageResourceMap.put("image5",
R.drawable.image5);
imageResourceMap.put("image6",
R.drawable.image6);
imageResourceMap.put("image7",
R.drawable.image7);
loadBitmaps();
}
private void loadBitmaps() {
imageBitmap = new HashMap<String, Bitmap>();
for (String s : imageResourceMap.keySet()) {
Bitmap tmp = getBitmapFromRes(imageResourceMap.get(s));
imageBitmap.put(s, tmp);
}
imageResourceMap = null;
}
private Bitmap getBitmapFromRes(int resId) {
Bitmap tmp = null;
Bitmap b = null;
try {
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
InputStream fis = context.getResources().openRawResource(resId);
tmp = BitmapFactory.decodeStream(fis, null, o);
fis.close();
BitmapFactory.Options o2 = new BitmapFactory.Options();
fis = context.getResources().openRawResource(resId);
b = BitmapFactory.decodeStream(fis, null, o2);
fis.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (tmp != null) {
tmp.recycle();
tmp = null;
}
}
return b;
}
public void setCorrectImages(Miner miner) {
iv1.setImageBitmap(imageBitmap.get("image1"));
iv2.setImageBitmap(imageBitmap.get("image2"));
iv3.setImageBitmap(imageBitmap.get("image3"));
iv4.setImageBitmap(imageBitmap.get("image4"));
iv5.setImageBitmap(imageBitmap.get("image5"));
iv6.setImageBitmap(imageBitmap.get("image6"));
iv7.setImageBitmap(imageBitmap.get("image7"));
iv1.setAdjustViewBounds(true);
iv2.setAdjustViewBounds(true);
iv3.setAdjustViewBounds(true);
iv4.setAdjustViewBounds(true);
iv5.setAdjustViewBounds(true);
iv6.setAdjustViewBounds(true);
iv7.setAdjustViewBounds(true);
}
public void recycleImageBitmaps() {
for (Bitmap b : imageBitmap.values()) {
if (b != null) {
b.recycle();
}
}
}
在我的活动中,我回收图片 onDestroy 并将其 onCreate
初始化我正在使用MAT找到泄漏点。看看printscreens:
图 的嫌疑人 的详情
此分支的每个开口都会显示相同的视图; /
我已经阅读了很多指南如何解决我的问题,但他们都没有帮助我
谢谢大家的帮助,当然我很抱歉我的英语......
答案 0 :(得分:1)
为什么要将资源转换为位图? android有一种非常有效的加载资源的方法,在我看来,将图像资源设置为图像视图应该非常有效。