我的UI中有三个(ABC,PQR,XYZ)按钮,如果我单击任何按钮,那么我的应用程序会从drawable
文件夹中加载不同的图像,但有时会给出OutOfMemory
{{1 }}。我使用以下代码从Exception
文件夹加载图像。
Drawable
我在logcat中遇到异常。
abc.setBackgroundResource(R.drawable.abc_on);
pqr.setBackgroundResource(R.drawable.pqr_off);
xyz.setBackgroundResource(R.drawable.xyz_off);
我正在使用Galaxy s4设备,并将我的图片放在 xxhdpi 文件夹中,而xml布局文件位于布局文件夹中。那么,请指导我如何处理这个问题。三江源。
答案 0 :(得分:0)
请检查图像大小,然后检查设备内存。可能是因为你的设备内存很低。在清单中添加此行,并查看错误是否包含:
android:largeHeap="true"
答案 1 :(得分:0)
可能是您在每次点击按钮时提交交易的方式。
考虑一个例子,当你有三个按钮,每个按钮都有自己的片段类。
因此,当您点击按钮 ABC 时,您向backstack
添加了一个与addToBackStack(null).commit()
类似的交易。
同样,您点击了按钮 PQR ,您又使用backstack
向addToBackStack(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的开发者文档 -
返回当前的每个应用程序的近似内存类 应用程序使用大堆运行时的设备。这是 可用于内存密集型应用程序的空间;大多数应用 不应该需要这么多的内存,而应该继续使用 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/。 我相信你的问题会得到解决。 希望这能帮助你。