【问题标题】:Using AnimationDrawable: Canvas: trying to use a recycled bitmap使用 AnimationDrawable:画布:尝试使用回收的位图
【发布时间】:2015-07-06 01:40:35
【问题描述】:

我正在使用 Animation drawable 来显示 gif。我将 gif 拆分为帧,创建了一个动画文件并使用以下方法加载它:

animationImageView.setImageResource(splashAnimationResource);       
animation = (AnimationDrawable) animationImageView.getDrawable();

所有这些都发生在 onResume() 中。动画显示后,在 onPause() 中我尝试释放内存:

for (int frameCounter = 0; frameCounter < animation.getNumberOfFrames(); ++frameCounter) {
        Drawable frame = animation.getFrame(frameCounter);
        if (frame instanceof BitmapDrawable) {
            BitmapDrawable castedFrame = (BitmapDrawable) frame;
            Bitmap bitmap = castedFrame.getBitmap();
            if (bitmap != null && !bitmap.isRecycled())
                bitmap.recycle();
        }
        frame.setCallback(null);
    }
splashAnimation.setCallback(null);

这一切都很好,动画显示正确,内存被释放。如果我尝试再次进入动画活动,它第一次工作,但随后抛出异常:

java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@2ee1a817
        at android.graphics.Canvas.throwIfCannotDraw(Canvas.java:1225)
        at android.view.GLES20Canvas.drawBitmap(GLES20Canvas.java:600)
        at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:544)
        at android.graphics.drawable.DrawableContainer.draw(DrawableContainer.java:76)
        at android.widget.ImageView.onDraw(ImageView.java:1187)
        at android.view.View.draw(View.java:16269)
        at android.view.View.updateDisplayListIfDirty(View.java:15192)
        at android.view.View.getDisplayList(View.java:15215)
        at android.view.View.draw(View.java:15990)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3708)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3502)
        at android.view.View.updateDisplayListIfDirty(View.java:15187)
        at android.view.View.getDisplayList(View.java:15215)
        at android.view.View.draw(View.java:15990)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3708)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3502)
        at android.view.View.updateDisplayListIfDirty(View.java:15187)
        at android.view.View.getDisplayList(View.java:15215)
        at android.view.View.draw(View.java:15990)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3708)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3502)
        at android.view.View.updateDisplayListIfDirty(View.java:15187)
        at android.view.View.getDisplayList(View.java:15215)
        at android.view.View.draw(View.java:15990)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3708)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3502)
        at android.view.View.draw(View.java:16272)
        at android.widget.FrameLayout.draw(FrameLayout.java:592)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:3047)
        at android.view.View.updateDisplayListIfDirty(View.java:15192)
        at android.view.View.getDisplayList(View.java:15215)
        at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:307)
        at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:313)
        at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:352)
        at android.view.ViewRootImpl.draw(ViewRootImpl.java:2811)
        at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2634)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2222)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1230)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6726)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:777)
        at android.view.Choreographer.doCallbacks(Choreographer.java:590)
        at android.view.Choreographer.doFrame(Choreographer.java:560)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:763)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:145)
        at android.app.ActivityThread.main(ActivityThread.java:6141)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

我真的很困惑。有什么想法吗?

【问题讨论】:

  • 抱歉这么晚才问..但是你有解决办法吗?
  • 并非如此。经过多天的尝试,我切换到显示视频:(
  • 您会发布您的解决方案吗?我相信它会很有价值
  • 是的,当然..给我一分钟

标签: android animation bitmap animationdrawable


【解决方案1】:

我在敲了几天的头后找到了解决方案。首先,您需要创建较小的图像尺寸,例如我首先使用 400x400 尺寸的框架..然后我减少到 100x100。然后我删除了位图回收的所有代码,因为这个问题没有任何解决方案。那你就玩animation.start().stop() 就很好了。

【讨论】:

    猜你喜欢
    • 2013-07-12
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 2015-12-04
    • 2012-12-17
    • 2011-05-15
    • 1970-01-01
    相关资源
    最近更新 更多