有三个屏幕。第一个是主屏幕,第二个是填充屏幕,第三个是包含4个按钮的屏幕。
主屏幕包含一个通向第二个屏幕的按钮,第二个屏幕包含另一个通向第三个屏幕的按钮。
图像存储在drawable-hdpi中。
当我按下第二个屏幕中的按钮,特别是第三个屏幕上的onCreate中的android.app.Activity.setContentView时,会发生outofmemoryerror。
如果应用程序仅从第1个屏幕到第3个屏幕,该应用程序正常工作,但我们需要在第1个和第3个屏幕之间添加一些屏幕。
这是logcat:
编辑:我有一个S4(国际)但它在Nexus 5上运行良好。
答案 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-ldpi
,drawable-mdpi
,drawable-hdpi
,drawable-xhdpi
有一个方便的工具可以执行脏工作:9 Patch Resizer