2016-11-23 36 views
0

時,我已經試過這樣: OutOfMemoryError的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(); 

我裝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空閒字節和2MB,直到OOM'您加載了多少個文件? – AxelH

+0

這條線可能只是冰山一角。高內存消耗可能在代碼的其他部分。 – raxelsson

+0

您可以使用Android Studio中的內存監視器來跟蹤您的分配情況。也許你有一些巨大的對象,由於內存泄漏而無法收集垃圾。最常見的泄露對象是上下文和位圖。您也可以嘗試一下庫LeakCanary,它會警告您內存泄漏。 –

回答

0

如何大是在像素方面的圖像。出現outOfMemroy異常的原因不是與圖像的字節大小有關,而是像素大小。我建議你使用這22個圖像中的10個,因爲它們只有100ms的動畫,因此用戶不會知道其中的差別。

1

動畫列表在開始動畫之前加載所有圖像。如果這導致OOM,則可以減少圖像數量,或者減小圖像的大小(像素大小,而不是文件大小)或兩者。或者您可以創建一個圖像加載器,將圖像加載到您的ImageView上。 另一種解決方案是創建動畫視頻並顯示該視頻。

我覺得沒有簡單的解決方案。我一直致力於開發具有多個同步動畫的應用程序,並且我們一直在努力讓所有的工作順利進行。我們最終在分辨率和圖像大小方面做出了妥協,並捨棄了一些動畫。

+0

我看到了我的Android監視器日誌和在我的**聯想k3運行遊戲注**顯示內存分配高達** 500MB **但運行相同的遊戲**酷派Note3 **只分配** 198MB **,這就是爲什麼遊戲在我的手機上崩潰的原因 我不明白爲什麼這樣的區別... .. – JDFuzyll

+0

謝謝.... 最後,我不得不使用VideoView作爲替代品,即使我以前的應用程序確實在另一部手機上工作 – JDFuzyll