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

时间:2015-02-04 12:07:54

标签: android out-of-memory heap

我的应用程序在平板电脑上正常运行,其内存非常少,约为20-30 MB,可以看出DBMS - >调试&堆跟踪器。但是在三星Galaxy Note-4(2560 x 1440)等设备上运行相同的应用程序时LG G3(2392 x 1440)在首次活动时占用大约200MB的堆空间,然后不断增长。

Heap Size on first activity run

我曾尝试检查内存泄漏和修复问题,检查游标和数据库实例是否也关闭了它们。尝试完成活动一旦转移到另一个。但仍然会出现“Out of Memory”错误。

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

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

2 个答案:

答案 0 :(得分:7)

在连续3天阅读了很多内容之后,我得到了问题的答案,最后问题解决了。

嗯,发生了什么

  

setBackgroundResource(R.drawable.imageName)

将导致Android首先执行

  

BitmapFactory.decodeResource()

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

Android需要几乎10倍的空间来渲染PNG然后再渲染JPG,因此我的应用程序在任何活动中渲染10-15个PNG图像时占用了大量空间。由于android没有释放内存空间,如果你的应用程序正在运行,会出现OOM (Out Of Memory)错误。

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

希望这也有助于其他人。

参考链接:

Android background image memory usage

答案 1 :(得分:0)

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

 android:largeHeap="true"

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

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">

此外,您可以通过programmaticaly增加堆大小:

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

相关问题