【问题标题】:Android: imageView.setImageResource(AnimationDrawable) causes memory errorAndroid:imageView.setImageResource(AnimationDrawable) 导致内存错误
【发布时间】:2013-02-12 11:41:20
【问题描述】:

这就是我正在做的事情

ImageView image2 = (ImageView) findViewById(R.id.imageView3);
image2.getDrawable().setCallback(null);
image2.setImageResource(R.drawable.fire);

其中 fire 是一个提出可绘制动画的 xml 文件

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" 
    android:oneshot="true">
<item android:drawable="@drawable/fire1" android:duration="50" />
<item android:drawable="@drawable/fire2" android:duration="50" />
<item android:drawable="@drawable/fire3" android:duration="50" />
<item android:drawable="@drawable/fire4" android:duration="50" />
<item android:drawable="@drawable/fire5" android:duration="50" />
...
<item android:drawable="@drawable/fire16" android:duration="50" />

我有这个错误

02-12 11:37:20.919: E/dalvikvm-heap(3193): 1535664-byte external allocation too large for this process.
02-12 11:37:20.959: E/GraphicsJNI(3193): VM won't let us allocate 1535664 bytes
02-12 11:37:20.959: W/dalvikvm(3193): threadid=1: thread exiting with uncaught exception (group=0x40018560)
02-12 11:37:20.979: E/AndroidRuntime(3193): FATAL EXCEPTION: main
02-12 11:37:20.979: E/AndroidRuntime(3193): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
02-12 11:37:20.979: E/AndroidRuntime(3193):     at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
02-12 11:37:20.979: E/AndroidRuntime(3193):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:460)
02-12 11:37:20.979: E/AndroidRuntime(3193):     at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:336)
02-12 11:37:20.979: E/AndroidRuntime(3193):     at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
02-12 11:37:20.979: E/AndroidRuntime(3193):     at android.content.res.Resources.loadDrawable(Resources.java:1709)
02-12 11:37:20.979: E/AndroidRuntime(3193):     at android.content.res.Resources.getDrawable(Resources.java:581)
02-12 11:37:20.979: E/AndroidRuntime(3193):     at android.graphics.drawable.AnimationDrawable.inflate(AnimationDrawable.java:267)
02-12 11:37:20.979: E/AndroidRuntime(3193):     at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:787)
02-12 11:37:20.979: E/AndroidRuntime(3193):     at android.graphics.drawable.Drawable.createFromXml(Drawable.java:728)
02-12 11:37:20.979: E/AndroidRuntime(3193):     at android.content.res.Resources.loadDrawable(Resources.java:1694)
02-12 11:37:20.979: E/AndroidRuntime(3193):     at android.content.res.Resources.getDrawable(Resources.java:581)
02-12 11:37:20.979: E/AndroidRuntime(3193):     at android.widget.ImageView.resolveUri(ImageView.java:501)
02-12 11:37:20.979: E/AndroidRuntime(3193):     at android.widget.ImageView.setImageResource(ImageView.java:280)
02-12 11:37:20.979: E/AndroidRuntime(3193):     at com.example.kersplatt.GameActivity.onCreate(GameActivity.java:71)
02-12 11:37:20.979: E/AndroidRuntime(3193):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-12 11:37:20.979: E/AndroidRuntime(3193):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
02-12 11:37:20.979: E/AndroidRuntime(3193):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
02-12 11:37:20.979: E/AndroidRuntime(3193):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
02-12 11:37:20.979: E/AndroidRuntime(3193):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
02-12 11:37:20.979: E/AndroidRuntime(3193):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-12 11:37:20.979: E/AndroidRuntime(3193):     at android.os.Looper.loop(Looper.java:130)
02-12 11:37:20.979: E/AndroidRuntime(3193):     at android.app.ActivityThread.main(ActivityThread.java:3683)
02-12 11:37:20.979: E/AndroidRuntime(3193):     at java.lang.reflect.Method.invokeNative(Native Method)
02-12 11:37:20.979: E/AndroidRuntime(3193):     at java.lang.reflect.Method.invoke(Method.java:507)
02-12 11:37:20.979: E/AndroidRuntime(3193):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:875)
02-12 11:37:20.979: E/AndroidRuntime(3193):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:633)
02-12 11:37:20.979: E/AndroidRuntime(3193):     at dalvik.system.NativeStart.main(Native Method)

我阅读了很多关于内存泄漏、内存错误的帖子(例如java.lang.OutOfMemoryError: bitmap size exceeds VM budget - Android),但我没有成功解决我的问题

当我将 image2.setImageResource(R.drawable.fire); 替换为 image2.setImageResource(R.drawable.fire1); 时,其中 fire1 是一个简单的 png,一切正常 我能做些什么来解决我的问题

【问题讨论】:

  • 要为视图设置动画,您应该使用“FrameAnimation”,其中您的所有项目都添加为框架并将该动画放入 ImageView。
  • 我该怎么做才能使我添加的图像(使用 addFrame)与最初在 imageview 中的图像具有相同的尺寸。当我做 image2.getLayoutParams().height=FrameLayout.LayoutParams.WRAP_CONTENT; image2.getLayoutParams().width=FrameLayout.LayoutParams.FILL_PARENT; (imageview的初始条件)它不起作用
  • 好的,我使用 fireAnimation.addFrame(new BitmapDrawable(decodeSampledBitmapFromResource(getResources(), R.drawable.fire1, 200, 200)),50);从你给的喜欢,它的工作原理谢谢!
  • 如果它适合您,请接受答案。谢谢。我已经发布了答案。

标签: android image animation memory


【解决方案1】:

要消除 OutOfMemory 错误,您应该专注于缩放。你可以在http://developer.android.com/training/displaying-bitmaps/load-bitmap.html找到

【讨论】:

    猜你喜欢
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多