应用程序因setCotentView(R.layout_file_name)行的内存不足而崩溃

时间:2016-04-14 13:37:16

标签: android android-layout error-handling runtime-error

在 -

时发出内存不足错误
        setContentView(R.layout.activity_home);

错误日志是 -

USER_COMMENT=null
ANDROID_VERSION=5.0 
APP_VERSION_NAME=1.0
BRAND=samsung
PHONE_MODEL=SM-G900H
CUSTOM_DATA=
STACK_TRACE=java.lang.OutOfMemoryError: Failed to allocate a 944652 byte allocation with 751892 free bytes and 734KB until OOM
...........................      

有时候在同一行充气时也会出现二进制xml错误。 并且每次运行代码时都会出现错误。 有人也看过这个或知道原因吗?提前谢谢。

2 个答案:

答案 0 :(得分:0)

从评论中看来,您有一个大的背景图像,因此您需要采取几个步骤来减少内存需求。

首先压缩图像(例如使用Photoshop的“导出为Web”选项)。

如果导出的图像是具有透明度或alpha的PNG,那么将导出的图像作为JPG可能是明智的,因为背景不需要此信息。

获得压缩大小的图片后,请确保使用的是适合您设备的版本 - 不要为您的bigest目标设备制作足够大的单个大图像,还要为较低规格的设备制作较小的版本您需要将其放置在特定于设备组的可绘制文件夹中。

您可以在Supporting Multiple Screen Sizes文档中看到这些组,但您需要的文件夹是

  • res/drawable-mdpi/graphic.png //中密度位图
  • res/drawable-hdpi/graphic.png //高密度位图(约480 * 720)
  • res/drawable-xhdpi/graphic.png //超高密度位图
  • res/drawable-xxhdpi/graphic.png //(根据Gurvinder评论大约960 * 1,440)

答案 1 :(得分:0)

正如评论所暗示的那样,您正在加载的图片大小存在问题。

首先只使用图像作为您所定位的屏幕大小的资源,然后使用具有不同密度和大小的资源文件夹为每个设备提供正确的图像。 (HDPI,XHDPI,ETC)

另外还要考虑到内存分配与位图的2的功率有关,所以可能稍微小一点会产生很大的不同,你可以使用BitmapFactory这样的东西进行测试和试用。

public static int calculateInSampleSize(
        BitmapFactory.Options options, int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;

if (height > reqHeight || width > reqWidth) {

    final int halfHeight = height / 2;
    final int halfWidth = width / 2;

    // Calculate the largest inSampleSize value that is a power of 2 and keeps both
    // height and width larger than the requested height and width.
    while ((halfHeight / inSampleSize) > reqHeight
            && (halfWidth / inSampleSize) > reqWidth) {
        inSampleSize *= 2;
    }
}

return inSampleSize;

}

来自android doc处理位图:http://developer.android.com/intl/es/training/displaying-bitmaps/load-bitmap.html#load-bitmap