Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从Drawable文件夹加载图像时OutOfMemory_Android_Out Of Memory_Drawable - Fatal编程技术网

Android 从Drawable文件夹加载图像时OutOfMemory

Android 从Drawable文件夹加载图像时OutOfMemory,android,out-of-memory,drawable,Android,Out Of Memory,Drawable,我的UI中有三个(ABC、PQR、XYZ)按钮,如果我单击任何按钮,那么我的应用程序将从drawable文件夹加载不同的图像,但有时会出现OutOfMemory异常。我使用以下代码从Drawable文件夹加载图像 abc.setBackgroundResource(R.drawable.abc_on); pqr.setBackgroundResource(R.drawable.pqr_off); xyz.setBackgroundResource(R.drawable

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

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

我的日志中出现以下异常

 E/AndroidRuntime(22116): java.lang.OutOfMemoryError
    E/AndroidRuntime(22116):    at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
    E/AndroidRuntime(22116):    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:677)
    E/AndroidRuntime(22116):    at    android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:507)
    E/AndroidRuntime(22116):    at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:872)
     E/AndroidRuntime(22116):   at android.content.res.Resources.loadDrawable(Resources.java:3024)
    E/AndroidRuntime(22116):    at android.content.res.Resources.getDrawable(Resources.java:1586)
     E/AndroidRuntime(22116):   at android.view.View.setBackgroundResource(View.java:16144)
   E/AndroidRuntime(22116):     at com.bloopit.fragments.ABCFragment.onClick(ABCFragment.java:242)

我正在使用Galaxy s4设备,并将我的图像放置在xxhdpi文件夹中,xml布局文件位于layout文件夹中。所以,请指导我如何处理这件事。谢谢。

请检查图像大小,然后检查设备内存。这可能是因为您的设备内存不足。在清单中添加此行,查看是否存在错误:

android:largeHeap="true"

这可能是您在每次单击按钮时提交事务的方式

假设有三个按钮,每个按钮都有自己的片段类。 因此,当您单击按钮ABC时,您向
backstack
添加了一个事务,类似于
addToBackStack(null).commit()

同样,您单击了按钮PQR,再次使用
addToBackStack(null).commit()将事务添加到
backstack

XYZ也是如此

由于事务是以错误的方式重复添加的,因此堆栈将满时会出现异常。

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

我遇到了类似的问题,我所做的只是在提交之前删除
addToBackStack(null)
东西。通过这种方式,您可以确保,如果这样做解决了问题

然后,您可以更好地处理特定的事务,以便有效地管理事务。 显然,有更好的方法可以做到这一点

从您提供的任何信息来看,几乎不可能只有三种资源能够消耗足够的存储并产生类似OOM的异常。应用程序中可能还有其他部分需要进一步考虑。 还可以使用方法检查可用堆大小-

  • maxMemory()

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

  • getMemoryClass()

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

  • getLargeMemoryClass()
开发人员文档中引用的-

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

如果您对确定应用程序堆大小特别感兴趣,并且希望详细理解,请参阅“./P>”。

  • android:largeHeap=“true”

    在您的清单中使用上述内容,但--

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


@Koti,我在我的应用程序中也遇到了这种情况,它有不同的片段,每个片段都有不同的背景。因此,我在我的案例中所做的是,我只在XML文件中设置背景,drawable中的图像应该具有尽可能低的内存。 为此,请使用。 我相信你的问题会用这个解决的。
希望这会让你受益。

我怀疑你的图像太大,而且你没有使用选择器。考虑使用九个补丁和选择器。recommended@Omar但似乎koti的设备空间很小,所以可能会有帮助。这是一种不好的做法。不应该使用它,但您也可以尝试使用finally block。。。所有初始化都将在try中,并在finally块中释放。
Runtime rt = Runtime.getRuntime();
long maxMemory = rt.maxMemory();
Log.v("onCreate", "maxMemory:" + Long.toString(maxMemory));
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
int memoryClass = am.getMemoryClass();
Log.v("onCreate", "memoryClass:" + Integer.toString(memoryClass));