OutOfMemoryError Android问题

时间:2014-11-07 20:55:37

标签: java android out-of-memory

有三个屏幕。第一个是主屏幕,第二个是填充屏幕,第三个是包含4个按钮的屏幕。

主屏幕包含一个通向第二个屏幕的按钮,第二个屏幕包含另一个通向第三个屏幕的按钮。

图像存储在drawable-hdpi中。

当我按下第二个屏幕中的按钮,特别是第三个屏幕上的onCreate中的android.app.Activity.setContentView时,会发生outofmemoryerror。

如果应用程序仅从第1个屏幕到第3个屏幕,该应用程序正常工作,但我们需要在第1个和第3个屏幕之间添加一些屏幕。

这是logcat: enter image description here

编辑:我有一个S4(国际)但它在Nexus 5上运行良好。

2 个答案:

答案 0 :(得分:0)

看起来您正在将位图加载到内存中。在Android应用程序中,你只有大约16兆字节的可用内存,所以你可以很快地用完ram,并且会发生outOfMemoryError。

您可以使用图片的资源ID而不是Bitmap对象来解决此问题。例如,使用:

setContentView(R.layout.view_id);

其中view_id是您要显示的视图的ID。

答案 1 :(得分:0)

如果您不遵循某些指导原则,在您的活动中使用图像可能会导致偶然的OutOfMemoryError。

首先,在代码中声明,初始化和使用Bitmaps时要特别注意。如果您想有效地使用它们,系统会以特殊的方式管理这些对象this is a good place to start

无论如何,由于你没有发布任何显示Bitmaps使用的代码,我把注意力集中在你问题的一行上:

  

图像存储在drawable-hdpi中。

图像是否仅存储在此类目录中?嗯,这是一个不好的做法,它是内存错误的来源;)

当您要求Android初始化特定活动时,在其XML中声明的所有图像都是从特定drawable-****文件夹加载的,具体取决于当前设备的屏幕大小。 例如,mdpi设备将开始在drawable-mdpi内查找名为img的图像。如果找不到,那么它会在所有其他可绘制文件夹中以级联行为查找。

问题在于:如果img位于与drawable-mdpi不同的文件夹中,则系统首先对其进行缩放以匹配mdpi的缩放系数。因此,创建了另一个位图副本。

由于所有图像都在一个高分辨率文件夹中,因此每个运行应用程序的非hdpi设备都会执行缩放操作。这根本不好(这里有一些docs)。

解决方案是创建同一图片的不同缩放版本,并将其存储在多个文件夹中,例如:drawable-ldpidrawable-mdpidrawable-hdpidrawable-xhdpi

有一个方便的工具可以执行脏工作:9 Patch Resizer