2016-11-23 5 views
0

Я попытался это: OutOfMemoryErrorOutOfMemoryError при загрузке анимации

и читать многие другие подобные сообщения, но ни один из них не работал

Это ошибка:

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 до 12 кБ)

Я прочитал много сообщений, ссылающихся на проблему с растровым изображением, но никто не мог мне помочь.

Я попытался это: 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(); 

Я загрузил 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

'Не удалось выделить выделение 4,940,652 байт с помощью бесплатных 2.168.368 байт и 2 МБ до тех пор, пока OOM' Сколько файлов вы не загрузили? – AxelH

+0

Потенциально эта линия может быть просто верхушкой айсберга. Высокое потребление памяти может быть в какой-то другой части кода. – raxelsson

+0

Вы можете использовать монитор памяти в Android Studio для отслеживания ваших распределений. Возможно, у вас есть огромные объекты, которые не могут быть собраны в мусор, из-за утечки памяти. Наиболее распространенными просочившимися объектами являются контексты и растровые изображения. Вы также можете попробовать библиотеку LeakCanary, которая предупреждает вас об утечке памяти. –

ответ

0

Насколько велики изображения в пикселях. Причина, по которой вы получаете исключение outOfMemroy, связана не с размерами байтов ваших изображений, а с размерами пикселей. Я бы рекомендовал вам использовать 10 из этих 22 изображений, так как они ожидают только 100 мс, и, следовательно, пользователь не будет знать разницу

1

Список анимации загружает все изображения перед началом анимации. Если это вызывает OOM, вы можете уменьшить количество изображений или уменьшить размер изображений (размер пикселя, а не размер файла) или и то, и другое. Или вы можете создать загрузчик изображений, который загружает изображения в ваш ImageView на лету. Еще одно решение - создать видеоролик вашей анимации и показать это видео.

Не думаю, что это будет простое решение. Я работал над приложением с несколькими одновременными анимациями, и мы постоянно боролись за то, чтобы все работало плавно. В итоге мы достигли компромиссов в разрешении и размерах изображений, а также оставили некоторые анимации.

+0

Я видел мои журналы Android-мониторов и запустил игру в своем ** Lenovo k3 Note ** отображает выделение памяти выше, чем ** 500MB **, но работает с той же игрой на ** Coolpad Note3 ** выделяет только ** 198MB **, и именно по этой причине игра вылетает на моем телефоне Я не понимаю, почему такая разница ... .. – JDFuzyll

+0

Спасибо .... В итоге мне пришлось использовать VideoView в качестве замены, хотя мое предыдущее приложение действительно работало на другом телефоне – JDFuzyll

Смежные вопросы