Android setImageDrawable内存不足

时间:2014-08-22 15:01:28

标签: android bitmap out-of-memory android-drawable android-bitmap

使用setImageDrawable从资源更新ImageView图像时,我遇到了内存不足错误。我见过的大多数其他stackoverflow帖子都比我想做的更复杂。为简单起见,我将尝试尽可能简单地解决这个问题。

我的应用程序有大约30个图像资源,我想在不同的时间加载到ImageView。要真正减少它,这是一行违规代码:

((ImageView)findViewById(R.id.myimageview)).setImageDrawable(getResources().getDrawable(R.drawable.somerandomdrawable));

当我按下各种按钮时,执行这行代码以更新myimageview以显示新图像。最终,由于内存不足,我的应用程序爆炸了。我无法理解Android为什么不发布/回收底层的drawable / bitmap。至少我看不到强引用在哪里发生。

将这些位图加载到内存(每个640x640 8位RGB的30位图)真的不是一个选项,因为它会立即炸毁应用程序。

3 个答案:

答案 0 :(得分:1)

你用这种方式试过吗?

ImageView image = (ImageView)findViewById(R.id.myimageview);
image.setImageDrawable(getResources().getDrawable(R.drawable.somerandomdrawable));

答案 1 :(得分:1)

好的,我想我会在这里回答我自己的问题。事实证明我的应用程序设计很差,并且最初加载了很多位图。加载后我的堆使用量超过59Mb!这只剩下大约6 Mb。

因此,当尝试使用扩展到大约1.6Mb(640x640 PNG图像)的资源加载/替换某些imageView图像时,如果我这么快就这样做,我可能会在垃圾收集器之前导致内存不足的情况有机会回收记忆。

android函数正在释放他们应该的内存,他们只是没有机会被垃圾收集。

无论如何,希望这会对其他人有所帮助。感谢您的投入,它帮助我指明了正确的方向。

答案 2 :(得分:0)

在我尝试使用picaso进行研究之后,我遇到了类似的内存错误问题,问题已经消失http://square.github.io/picasso/