【问题标题】:Android Memory Leak - setBackgroundDrawable - with imagesAndroid 内存泄漏 - setBackgroundDrawable - 带有图像
【发布时间】:2015-01-08 20:01:19
【问题描述】:

当用户单击按钮时,我会在 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 解决了这个问题。这一变化显着降低了内存需求。

【问题讨论】:

  • 当您在应用程序中显示更多图像时,当您一次显示所有图像时,您必须使用图像加载器任务处理图像大小超过堆大小,从而出现内存不足异常
  • 图片的尺寸是多少?
  • background drawables 意味着它可能超过 800x1280 的图像,所以这就是他内存不足的原因@Simon
  • 这就是我的想法。但是,他可能会使用更小的和升级的?
  • 通过开发者网站的Loading Large Bitmaps Efficiently 以有效的方式显示大图

标签: android performance android-activity


【解决方案1】:

这可能是因为您的图像资源位于drawable 文件夹中;相当于drawable-mdpi。您的设备可能不是mdpi

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

Referred from here

【讨论】:

  • 谢谢 Darpan,是的,这在一定程度上减少了内存占用,但还不够。必须在不同尺寸的设备上试用才能完全看到它的好处。
【解决方案2】:

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

希望这会有所帮助

【讨论】:

  • 试试这个位图 bit= BitmapFactory.decodeResource(getResources(), R.drawable.large_icon); user_image.setImageBitmap(bit);
【解决方案3】:

每个尺寸为 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();
}

【讨论】:

  • 谢谢你 fRoStBiT - 我试过了,但没有解决问题。
【解决方案4】:

我不认为如此频繁地更改背景布局是一个好主意。我建议您可以使用RelativeLayoutImageView 作为第一项。然后每次你需要改变你的背景时,你可以用一些缓存库来改变你的ImageView,例如:Universal Image Loader

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 2012-11-19
    • 2021-01-27
    • 2011-12-31
    相关资源
    最近更新 更多