我试过这个: 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>
答案 0 :(得分:1)
动画列表在开始动画之前加载所有图像。如果这会导致OOM,您可以减少图像数量,或减小图像的大小(像素大小,而不是文件大小),或两者兼而有之。或者,您可以创建一个图像加载器,将图像动态加载到ImageView。 另一种解决方案是创建动画视频并显示该视频。
我认为没有简单的解决方案。我一直在开发一个具有多个同步动画的应用程序,我们一直在努力让一切顺利运行。我们最终在分辨率和图像尺寸上做出妥协,并省略了一些动画。
答案 1 :(得分:0)
图像的像素大小。获得outOfMemroy异常的原因与图像的字节大小无关,而是与像素大小有关。我建议您使用这22幅图像中的10幅,因为它们的动画效果仅为100毫秒,因此用户不会知道其中的差异