从Drawable文件夹加载图像时OutOfMemory

时间:2014-04-14 07:53:15

标签: android out-of-memory drawable

我的UI中有三个(ABC,PQR,XYZ)按钮,如果我单击任何按钮,那么我的应用程序会从drawable文件夹中加载不同的图像,但有时会给出OutOfMemory {{1 }}。我使用以下代码从Exception文件夹加载图像。

Drawable

enter image description here

我在logcat中遇到异常。

      abc.setBackgroundResource(R.drawable.abc_on);
    pqr.setBackgroundResource(R.drawable.pqr_off);
    xyz.setBackgroundResource(R.drawable.xyz_off);

我正在使用Galaxy s4设备,并将我的图片放在 xxhdpi 文件夹中,而xml布局文件位于布局文件夹中。那么,请指导我如何处理这个问题。三江源。

3 个答案:

答案 0 :(得分:0)

请检查图像大小,然后检查设备内存。可能是因为你的设备内存很低。在清单中添加此行,并查看错误是否包含:

android:largeHeap="true"

答案 1 :(得分:0)

可能是您在每次点击按钮时提交交易的方式。

考虑一个例子,当你有三个按钮,每个按钮都有自己的片段类。 因此,当您点击按钮 ABC 时,您向backstack添加了一个与addToBackStack(null).commit()类似的交易。

同样,您点击了按钮 PQR ,您又使用backstackaddToBackStack(null).commit()添加了一项交易。

XYZ 也是如此。

由于交易是以错误的方式重复添加的,因此当堆栈已满并且OOM exception.

时,将会出现这一点。

首先检查将事务添加到Backstack的方式。

我遇到了类似的问题,我所做的只是在提交前删除addToBackStack(null)的东西。这样你可以确保如果它解决了这个问题。

然后,您可以更好地处理该特定事物,从而有效地管理交易。 显然有更好的方法可以做到这一点。

根据您提供的任何信息,几乎不可能只有三个资源可以消耗足够的存储空间并提供像OOM这样的异常。应用程序中可能还有其他部分需要稍后考虑。

您还可以使用方法检查可用的堆大小 -

  • <强> maxMemory()

    Runtime rt = Runtime.getRuntime();
    long maxMemory = rt.maxMemory();
    Log.v("onCreate", "maxMemory:" + Long.toString(maxMemory));
    

它将告诉您在触发硬错误之前允许您使用的应用程序堆的总字节数。

  • <强> getMemoryClass()

    ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
    int memoryClass = am.getMemoryClass();
    Log.v("onCreate", "memoryClass:" + Integer.toString(memoryClass));
    

考虑到Android操作系统版本和用户设备硬件的限制,它会告诉您应用程序应该使用多少堆。

  • getLargeMemoryClass()

引用getLargeMemoryClass的开发者文档 -

  

返回当前的每个应用程序的近似内存类   应用程序使用大堆运行时的设备。这是   可用于内存密集型应用程序的空间;大多数应用   不应该需要这么多的内存,而应该继续使用   getMemoryClass()限制。返回值以兆字节为单位。这个   可能与内存受限的getMemoryClass()大小相同   设备,或者在具有大型设备的设备上可能会大得多   可用RAM量。应用程序的Dalvik堆的大小(如果有)   指定android:largeHeap =&#34; true&#34;在它的清单中。

如果您对确定应用程序堆大小特别感兴趣,并希望了解详细信息,请考虑查看detect-application-heap-size-in-android

  • <强>机器人:largeHeap =&#34;真&#34;

    在清单中使用以上内容,但是 -

  

大多数应用程序不应该需要这个,而应该专注于减少   它们的整体内存使用率以提高性能。启用此功能   也不保证可用内存的固定增加,因为   某些设备受其总可用内存的限制。

答案 2 :(得分:0)

@Koti,我也在我的应用程序中面对这种情况,它有各种片段,每个片段都有不同的背景。所以我在我的情况下所做的是,我只在XML文件中设置了背景,并且在drawable应该具有低内存。 为此目的,使用https://tinypng.com/。 我相信你的问题会得到解决。 希望这能帮助你。