java.lang.OutOfMemoryError: 分配内存失败,导致内存耗尽

5
实际上,我正在尝试创建一个包含大量多媒体文件(包括图像和视频)的应用程序。我的应用程序大小约为34MB,我的资产大小约为60MB。当我在普通设备上加载应用程序时,我们没有遇到任何问题,但是具有2K分辨率(例如Nexus 6P、HTC、LG等)的设备会在过程中崩溃,并显示错误“内存不足”。 我已经生成了这个错误报告。我也尝试过位图工厂。 同时,我正在使用数组方法中的视频。
有人可以帮助解决这个问题吗?
致命异常:主进程:com.example.we.appname,PID:9353 java.lang.OutOfMemoryError:无法分配1660396字节的分配,其中1243880字节是空闲的,直到OOM还剩下1214KB dalvik.system.VMRuntime.newNonMovableArray(Native Method)android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:620)android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:455)android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:1155)android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:720)android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:571)android.content.res.Resources.loadDrawable(Resources.java:858)android.content.res.TypedArray.getDrawable(TypedArray.java:928)android.graphics.drawable.AnimationDrawable.inflateChildElements(AnimationDrawable.java:327)android.graphics.drawable.AnimationDrawable.inflate(AnimationDrawable.java:297)android.graphics.drawable.DrawableInflater.inflateFromXml(DrawableInflater.java:130)android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:1227)android.graphics.drawable.Drawable.createFromXml(Drawable.java:1200)android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:715)android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:571)android.content.res.Resources.getDrawable(Resources.java:771)android.content.Context.getDrawable(Context.java:525)android.view.View.setBackgroundResource(View.java:18228)com.example.kq.meettheshps.Score_Card.onCreate(Score_Card.java:58)android.app.Activity.performCreate(Activity.java:6679)android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)android.app.ActivityThread.-wrap12(ActivityThread.java)android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)android.os.Handler.dispatchMessage(Handler.java:102)android.os.Looper.loop(Looper.java:154)android.app.ActivityThread.main(ActivityThread.java:6119)java.lang.reflect.Method.invoke(Native Method)com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

根据屏幕尺寸高效加载位图。请参考此链接:https://developer.android.com/training/displaying-bitmaps/load-bitmap.html - rafsanahmad007
4个回答

15

我发现的简单解决方案是,在AndroidManifest.xml中在application下添加hardwareAcceleratedlargeHeap

<application
     android:allowBackup="true"
     android:hardwareAccelerated="false"
     android:icon="@mipmap/ic_launcher"
     android:label="@string/app_name"
     android:largeHeap="true"
     android:supportsRtl="true"
     android:theme="@style/AppTheme">

2
为什么应该将hardwareAccelerated设置为false? - venkat
hardwareAccelerated = false 会影响动画、阴影和高程,使它们看起来不好。 - Ben
据我所知,不建议使用largeHeap,因为它可能会引起其他问题,并且不是一个永久的解决方案。 - Abdulrahman Hasanato

3
在处理位图(Bitmap)时,常见的错误是内存不足,因此需要在AndroidManifest.xml文件中添加以下行:android:largeHeap="true"
 <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:largeHeap="true"
        android:hardwareAccelerated="false"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme.NoActionBar">

希望对你有所帮助。


2

看起来你可能会在RAM中缓存过多文件,或者重复实例化相同的位图和视频,直到内存耗尽。

如果你没有特殊要求,在2016年的Android上不应该编写自己的图像加载和缓存代码。使用已经解决了这个问题的库之一。请参见Picasso v/s Imageloader v/s Fresco vs Glide以获取更多指导。


0

这是由于图片尺寸过大导致的。请尝试使用小尺寸图片,例如您手机屏幕分辨率大小的图片。

我曾经遇到同样的问题。我在Paint中将图片尺寸缩小至2100 x 1300像素,虽然解决了问题,但应用程序非常卡顿。


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