如何解决Android中的java.lang.OutOfMemoryError问题

79
尽管我在drawable文件夹里有非常小的图片,但用户报告了这个错误。并且我在代码中没有故意使用任何位图函数。

虽然我在drawable文件夹里有很小的图片,但用户报告出错了。而且我没有在代码中故意使用任何位图函数 :)

java.lang.OutOfMemoryError
    at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:683)
    at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:513)
    at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:889)
    at android.content.res.Resources.loadDrawable(Resources.java:3436)
    at android.content.res.Resources.getDrawable(Resources.java:1909)
    at android.view.View.setBackgroundResource(View.java:16251)
    at com.autkusoytas.bilbakalim.SoruEkrani.cevapSecimi(SoruEkrani.java:666)
    at com.autkusoytas.bilbakalim.SoruEkrani$9$1.run(SoruEkrani.java:862)
    at android.os.Handler.handleCallback(Handler.java:733)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:146)
    at android.app.ActivityThread.main(ActivityThread.java:5602)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
    at dalvik.system.NativeStart.main(Native Method)
根据这个堆栈跟踪,我在这一行遇到了这个错误('tv'是一个textView):

根据这个堆栈跟踪,我在这一行遇到了这个错误('tv'是一个textView):

tv.setBackgroundResource(R.drawable.yanlis);

问题是什么?如果您需要关于代码的其他信息,我可以添加它。 谢谢!


1
你读过这个吗?http://developer.android.com/training/displaying-bitmaps/load-bitmap.html - 2Dee
试试这个:https://dev59.com/sOo6XIcBkEYKwwoYLhPO - Slampy
不,但正如我所说,我的图像非常小(最大为600kb)。我猜这是针对较大的图像。@2Dee - Utku Soytaş
你好 @Utku,你能解释一下你是否解决了这个问题吗? - isa
6个回答

6
我只看到两个选项:
  1. 您的应用程序存在内存泄漏。
  2. 设备在运行您的应用程序时没有足够的内存。

5
我该如何修复应用程序中的内存泄漏? - Utku Soytaş
3
通过检测生成和存储大量数据的位置(通常是由于未释放图像的问题),您可能会发现这很有帮助。您可以在此处找到相关信息:https://dev59.com/63E95IYBdhLWcg3wd9tK - Cativail

5
如果您遇到了java.lang.OutOfMemoryError错误,这是Android中最常见的问题。当JVM无法分配对象,因为内存空间不足时,就会抛出此错误。
请在应用程序下的manifest.xml文件中尝试添加以下代码:android:hardwareAccelerated="false" , android:largeHeap="true"
<application
  android:name=".MyApplication"
  android:allowBackup="true"
  android:icon="@mipmap/ic_launcher"
  android:label="@string/app_name"
  android:theme="@style/AppTheme"
  android:hardwareAccelerated="false"
  android:largeHeap="true" />

为什么我应该添加 android:hardwareAccelerated="false"? 如果我设置为 true,会发生什么呢? - Prince Dholakiya
5
如果你在项目中写入hardwareAccelerated="false",则CardView不会获得阴影效果,想一想? - dileep krishnan

5
处理Android应用程序的错误/异常的几个提示:
  1. 活动和应用程序有以下方法:

    • onLowMemory
    • onTrimMemory,可以使用这些方法来监视内存使用情况。
  2. Manifest中的 <application> 标签可以设置属性 'largeHeap' 为 TRUE,请求更多的堆空间给应用沙盒。

  3. 管理内存缓存和磁盘缓存:

    • 图像和其他数据可能会被缓存在内存中,(在活动/片段和全局范围内)需要进行管理或删除。
  4. 使用Java实例创建的WeakReference,SoftReference、特别是针对文件。

  5. 如果有很多图片,请使用适当的库/数据结构来管理内存,使用加载的图像的采样,处理磁盘缓存。

  6. 处理OutOfMemory异常。

  7. 遵循最佳编码实践

    • 泄漏内存(不要通过强引用持有所有内容)
  8. 尽量减少活动堆栈,例如堆栈中的活动数量(不要在上下文/活动中持有所有内容)

    • 上下文有意义,那些不需要超出范围(活动和片段)的数据/实例,应该将它们保留在适当的上下文中而不是全局引用保留。
  9. 尽量减少静态变量的使用,使用更多的单例。

  10. 注意操作系统基本的内存原则。

    • 内存碎片化问题
  11. 在确定不再需要内存缓存时,有时需要手动调用GC.Collect()。


请问您能否分享如何处理OutOfMemory异常的代码? - Chetan Chaudhari

4
处理位图时,建议实现LRU缓存管理器。
可以参考以下链接:http://developer.android.com/reference/android/util/LruCache.html, http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html, 和When should I recycle a bitmap using LRUCache? 或者使用类似Universal Image Loader这样的库:https://github.com/nostra13/Android-Universal-Image-Loader 更新:
现在处理图片,尤其是位图,建议使用Glide库。该库允许您配置一个Glide模块和一个LRUCache。
请参考以下链接:https://github.com/bumptech/glide

0

检查图片大小

我直接通过XML(app:srcCompat)在ImageView中加载了一个大约350KB的图像,结果导致OOM错误并使应用程序崩溃。

为了解决这个问题,我使用Glide将完全相同的图像加载到同一个ImageView中,然后它就能正常工作了!

教训:减小图片大小/延迟加载图片


0

android:largeHeap="true"并没有解决错误

在我的情况下,我在将SVG转换为矢量图后将图标/图像添加到Drawable文件夹中后出现了此错误。简单地打开图标XML文件并为宽度和高度设置较小的数字即可解决问题。

android:width="24dp"
android:height="24dp"
android:viewportWidth="3033"
android:viewportHeight="3033"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接