Android内存泄漏 - setBackgroundDrawable - 带图像

时间:2015-01-08 20:01:19

标签: android performance android-activity

当用户点击按钮时,我会在活动代码中继续切换这样的布局背景:

...
mylayout.setBackgroundDrawable(getResources().getDrawable(R.drawable.img1));//On First click
mylayout.setBackgroundDrawable(getResources().getDrawable(R.drawable.img2));//On Second Click
mylayout.setBackgroundDrawable(getResources().getDrawable(R.drawable.img10));//On 10th Click
...
mylayout.setBackgroundDrawable(getResources().getDrawable(R.drawable.img1));//On 11th Click 1st image again and so on.

我有10张图片,我一直在旋转 很快,它会导致OutOfMemory异常。我做错了什么?

如果在我的清单文件中有问题,我有:

android:minSdkVersion="11"
android:targetSdkVersion="17" />

编辑1
图像的平均大小为:50K
图像的平均尺寸为:600x450
所有图像img1,img2等都是jpeg图像

解决方案更新
将图像尺寸缩小到300x200解决了这个问题。这一次变化显着降低了内存需求。

4 个答案:

答案 0 :(得分:1)

可能会发生这种情况,因为您的图片资源位于drawable文件夹中;这相当于drawable-mdpi。您的设备可能不是mdpi

因此,要么提供您要支持的所有熨平板密度的图像。或者,将图像放在drawable-nodpi中,这样您的图像就不会调整大小。因此没有OutOfMemoryException

Referred from here

答案 1 :(得分:0)

  

如果您可以使用位图更改Drawable,请使用Bitmap.recycle()。

希望这会有所帮助

答案 2 :(得分:0)

尺寸为600x450的每个位图在RAM中的大小为600 * 450 * 4 = 1 080 000字节(1 MB)。 您应该以另一种方式加载如此大的位图:

Bitmap bitmap = BitmapFactory.decodeResource(resources, R.drawable.img1);
myLayout.setBackgroundDrawable(new BitmapDrawable(resources, bitmap));

之前更改您必须执行的视图背景

Drawable background = myLayout.getBackground();
if (background != null && background instanceof BitmapDrawable) {
    myLayout.setBackgroundDrawable(null);
    BitmapDrawable bd = (BitmapDrawable) background;
    bd.getBitmap().recycle();
}

答案 3 :(得分:0)

我不认为如此频繁地改变背景布局是一个很好的理想选择。我建议您使用RelativeLayout作为第一项ImageView。然后,每当您需要更改背景时,您都可以使用某些缓存的库更改ImageView,例如:Universal Image Loader