高分辨率手机内存不足错误

Out of Memory Error on High Resolution mobile phones

我的应用程序在平板电脑上 运行 很好,它占用的内存非常少,大约 20-30 MB,如 DBMS -> Debug & Heap tracker 所示。但是当 运行 在三星 Galaxy Note-4 (2560 x 1440) 和 LG G3 (2392 x 1440) 等设备上使用相同的应用程序时,它首先 activity 占用大约 200MB 的堆 space 然后持续增长。

我已经尝试检查 logcats 是否存在内存泄漏和已修复的问题,检查游标和数据库实例也关闭了它们。尝试完成 activity 一次移动到另一个。但仍然出现 "Out Of Memory" 错误。

尝试将堆大小增加到更大,但没有帮助,因为内存无法以某种方式释放。

注意:我对整个应用程序使用相同的可绘制图像,没有为其他设备创建不同的文件夹。整个图像大小约为 4MB,有将近 400 张图像,但在任何布局中一次只使用 15 张图像。

可能您错误地增加了堆大小。在 AndroidManifest 中输入:

 android:largeHeap="true"

如果没有t work, try to use this inbuild.settings` 文件:

设置={ android = { largeHeap = true }}

如果不起作用,请尝试:

<android xmlns:android="http://schemas.android.com/apk/res/android">
        <tool-api-level>14</tool-api-level>
        <manifest android:installLocation="auto" android:versionCode="1"
            android:versionName="1" package="com.company.appname" xmlns:android="http://schemas.android.com/apk/res/android">
            <uses-sdk android:minSdkVersion="14"/>

然后

<application android:debuggable="false"
    android:icon="@drawable/appicon"
    android:label="Appname" android:largeHeap="true" android:name="AppnameApplication">

您也可以通过编程方式增加堆大小:

使用 FLAG_LARGE_HEAP 检查 ApplicationInfo 个对象。您可以从 PackageManager 获取这些对象(例如,通过 getApplicationInfo())。

我连续3天看了很多文章,终于找到了问题的答案。

嗯,发生的事情是

setBackgroundResource(R.drawable.imageName)

将导致 Android 首先执行

BitmapFactory.decodeResource()

这实际上会根据屏幕密度进行一些重采样 (即,针对设备分辨率自动进行基于密度的重采样) 这会导致尺寸增大很多,PNG 图像也是如此.

Android 渲染 PNG 比渲染 JPG 花费的时间几乎多 space 的 10 倍,所以它消耗了很多 space 因为我的应用程序正在渲染 10-15 张 PNG 图像 activity。由于 android 不会释放 space 内存,如果您的应用程序是 运行,则会出现 OOM (Out Of Memory) 错误.

所以我所做的只是将 res/drawable 放到 res/drawable-nodpi/ (以防止自动基于密度的重采样) 我被排序了。

希望这对其他人也有帮助。

引用link:

Android background image memory usage