加载动画时出现OutOfMemoryError

时间:2016-11-23 09:15:27

标签: java android dalvik

我试过这个: OutOfMemoryError

阅读了许多其他此类帖子,但其中没有一个有用

这是错误:

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.lud.root.jetfighter, PID: 19789
                  java.lang.OutOfMemoryError: Failed to allocate a 4940652 byte allocation with 2168368 free bytes and 2MB until OOM
                      at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
                      at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
                      at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:651)
                      at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:486)
                      at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:1085)
                      at android.content.res.Resources.loadDrawableForCookie(Resources.java:2879)
                      at android.content.res.Resources.loadDrawable(Resources.java:2768)
                      at android.content.res.TypedArray.getDrawable(TypedArray.java:870)
                      at android.graphics.drawable.AnimationDrawable.inflateChildElements(AnimationDrawable.java:324)
                      at android.graphics.drawable.AnimationDrawable.inflate(AnimationDrawable.java:294)
                      at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:1220)
                      at android.graphics.drawable.Drawable.createFromXml(Drawable.java:1129)
                      at android.content.res.Resources.loadDrawableForCookie(Resources.java:2874)
                      at android.content.res.Resources.loadDrawable(Resources.java:2768)
                      at android.content.res.Resources.getDrawable(Resources.java:932)
                      at android.support.v7.widget.ResourcesWrapper.getDrawable(ResourcesWrapper.java:133)
                      at android.content.Context.getDrawable(Context.java:465)
                      at android.view.View.setBackgroundResource(View.java:17566)
                      at android.support.v7.widget.AppCompatImageView.setBackgroundResource(AppCompatImageView.java:76)
                      at com.lud.root.jetfighter.Instruction.onCreate(Instruction.java:32)
                      at android.app.Activity.performCreate(Activity.java:6583)
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1114)
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2531)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2666)
                      at android.app.ActivityThread.-wrap11(ActivityThread.java)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1493)
                      at android.os.Handler.dispatchMessage(Handler.java:111)
                      at android.os.Looper.loop(Looper.java:207)
                      at android.app.ActivityThread.main(ActivityThread.java:5769)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
I/System: FinalizerDaemon: finalize objects = 381

阅读其他一些帖子我才知道超出内存限制的大位图,但文件太小,我认为超出限制(它们是8到12kB最大.png文件)

我已经阅读了许多涉及位图问题的帖子,但没有一个可以帮助我。

我试过这个: android:largeHeap="true"

但由于它没有用,我读了另一篇文章并建议删除它,所以我做了。

我的 Instuction.java 文件遇到错误:

setContentView(R.layout.activity_instruction);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
ll = (LinearLayout)findViewById(R.id.instruction);
ll.setOnClickListener(this);
imv1 = (ImageView) findViewById(R.id.instruction_imv1);
imv3 = (ImageView) findViewById(R.id.instruction_imv3);
imv1.setBackgroundResource(R.drawable.inst);   // **This is where error occurs**
imv3.setBackgroundResource(R.drawable.collision); 

tap = (AnimationDrawable) imv1.getBackground();
tap.start();

collision = (AnimationDrawable) imv3.getBackground();
collision.start();

我为 inst 动画加载了22个文件。

这是我的 inst.xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/selected" android:oneshot="false">
    <item android:drawable="@drawable/enlarge001" android:duration="100" />
    <item android:drawable="@drawable/enlarge002" android:duration="100" />
    <item android:drawable="@drawable/enlarge003" android:duration="100" />
    <item android:drawable="@drawable/enlarge005" android:duration="100" />
    <item android:drawable="@drawable/enlarge006" android:duration="100" />
    <item android:drawable="@drawable/enlarge007" android:duration="100" />
    <item android:drawable="@drawable/enlarge008" android:duration="100" />
    <item android:drawable="@drawable/enlarge009" android:duration="100" />
    <item android:drawable="@drawable/enlarge010" android:duration="100" />
    <item android:drawable="@drawable/enlarge011" android:duration="100" />
    <item android:drawable="@drawable/enlarge012" android:duration="100" />
    <item android:drawable="@drawable/enlarge013" android:duration="100" />
    <item android:drawable="@drawable/enlarge014" android:duration="100" />
    <item android:drawable="@drawable/enlarge015" android:duration="100" />
    <item android:drawable="@drawable/enlarge016" android:duration="100" />
    <item android:drawable="@drawable/enlarge017" android:duration="100" />
    <item android:drawable="@drawable/enlarge018" android:duration="100" />
    <item android:drawable="@drawable/enlarge020" android:duration="100" />
    <item android:drawable="@drawable/enlarge021" android:duration="100" />
    <item android:drawable="@drawable/enlarge022" android:duration="100" />

</animation-list>

2 个答案:

答案 0 :(得分:1)

动画列表在开始动画之前加载所有图像。如果这会导致OOM,您可以减少图像数量,或减小图像的大小(像素大小,而不是文件大小),或两者兼而有之。或者,您可以创建一个图像加载器,将图像动态加载到ImageView。 另一种解决方案是创建动画视频并显示该视频。

我认为没有简单的解决方案。我一直在开发一个具有多个同步动画的应用程序,我们一直在努力让一切顺利运行。我们最终在分辨率和图像尺寸上做出妥协,并省略了一些动画。

答案 1 :(得分:0)

图像的像素大小。获得outOfMemroy异常的原因与图像的字节大小无关,而是与像素大小有关。我建议您使用这22幅图像中的10幅,因为它们的动画效果仅为100毫秒,因此用户不会知道其中的差异