当前位置: 首页 > 知识库问答 >
问题:

Canvas:尝试在配置更改片段时使用回收的位图崩溃

仇龙光
2023-03-14

我在片段中有一个listview。listview的每一行都有imageview,我正在加载位图图像。我将位图设置为imageview的标记。下次遇到带有非空标记的图像视图时,我会在标记中回收位图并将图像重新加载到其中。这导致崩溃“画布:试图使用回收的位图android.graphics.bitmap”在活动方向更改时崩溃。我不明白为什么会这样。请帮忙。

 Bitmap bitmap = (Bitmap) imageView.getTag();
    if (bitmap != null && !bitmap.isRecycled()) {
        bitmap.recycle();
    }
    Ion.with(appContext)
            .load(uri)
            .asBitmap()
            .setCallback(new FutureCallback<Bitmap>() {
                @Override
                public void onCompleted(Exception e, Bitmap result) {
                    if (result != null) {
                        imageView.setImageBitmap(result);
                        imageView.setTag(result);
                    }
                }
            });

堆栈跟踪:java.lang.RuntimeException:画布:尝试使用回收的位图android.graphics.Bitmap@31a3918android.graphics.Canvas.throwIfCannotDraw(Canvas.java:1270)android.graphics.Canvas.drawBitmap(Canvas.java:1404)android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:544)android.widget.ImageView.onDraw(ImageView.java:1228)android.view.view.draw(view.java:16184)android.view.view.view.updateDisplayListIfDirty(view.java:15180)android.view.view.draw(view.java:15954)在android.view.ViewGroup.drawChild(ViewGroup.java:3609)在android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399)在android.view.view.updateDisplayListIfDirty(view.java:15175)在android.view.view.draw(view.java:15954)在android.view.ViewGroup.drawChild(ViewGroup.java:3609)在android.widget.ListView.drawChild(ListView.java:3418)在android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399)在android.widget.AbsListView.dispatchDraw(AbsListView.java:2615)在android.widget.ListView.dispatchDraw(ListView.java:3413)在android.view.view.draw(view.java:16187)在android.widget.AbsListView.draw(AbsListView.java:4166)在android.view.view.view.updateDisplayListIfDirty(view.java:15180)在android.view.view.view.view.draw(view.java:15954)在android.view.ViewGroup.drawChild(ViewGroup.java:3609)在android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399)在android.view.view.updateDisplayListIfDirty(view.java:15175)在android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)在android.view.view.updateDisplayListIfDirty(view.java:15140)在android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)在android.view.view.updateDisplayListIfDirty(view.java:15140)在android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)在android.view.view.updateDisplayListIfDirty(view.java:15140)在android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)在android上。view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)在android上。view.view.updateDisplayListIfDirty(view.java:15140)在android上。view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)在android上。view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)在android上。view.view.updateDisplayListIfDirty(view.java:15140)在android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)在android.view.view.updateDisplayListIfDirty(view.java:15140)在android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)在android.view.view.view.updateDisplayListIfDirty(View.java:15140)在android.View.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)在android.View.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)在android.View.View.updateDisplayListIfDirty(View.java:15140)在android.View.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:281)在android.View.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:287)在android.view.ThreadedRenderer.draw(ThreadedRenderer.java:322)at android.view.ViewRootImpl.draw(ViewRootImpl.java:2615)at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2434)at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2067)at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107)at android.view.ViewRootImpl$TraversalRunable.run(ViewRootImpl.java:6013)atandroid.view.Choreographer$CallbackRecord.run(Choreographer.java:858)at android.view.Choreographer.doCallbacks(Choreographer.java:670)at android.view.Choreographer.doFrame(Choreographer.java:606)at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)at android.os.Handler。

共有1个答案

富建章
2023-03-14
    Bitmap bitmap = (Bitmap) imageView.getTag();
        if (bitmap != null && !bitmap.isRecycled()) {
           // bitmap.recycle();

 Ion.with(appContext)
                .load(uri)
                .asBitmap()
                .setCallback(new FutureCallback<Bitmap>() {
                    @Override
                    public void onCompleted(Exception e, Bitmap result) {
                        if (result != null) {
                            imageView.setImageBitmap(result);
                            imageView.setTag(result);
                        }
                    }
                });

        }


Try this. 
 类似资料:
  • 这是我的缓存: 有什么想法为什么这会失败在Android2.3而不是4.0?

  • 更具体地说,我有一个活动,它包含一个tablayout,每个选项卡基本上都应该加载一个独立的片段,其中包含一个Recolyer视图,我希望使用RecolyerView根据用户操作加载从api检索的数据 ,所以这就是活动: 这是我的第一个选项卡中应该显示的第一个片段 **

  • 问题内容: 我正在创建一个以显示图片网格。选择其中一个时,它应打开一个带有过渡的新活动。 我正在使用Glide库加载图片,并且过渡效果很糟糕,因为它在新活动中重新加载了图片。因此,我必须将其保存在缓存中,然后将其用于过渡。 我有代码,但有时如果图片未加载,则会抛出Canvas RuntimeException。 这是日志: 这是打开其他活动并将图片保存为缓存的代码: 我该怎么做才能解决此问题?提前

  • 在旁观者(@NonNull视听者持有人,国际位置)上的公共空白{ 单击cardView时,Intent不会传递给其他活动。

  • 我正在创建和应用程序,到目前为止一切都很好。今天,我处理一个片段中的数据,以访问我的webservice并返回json,然后将该数据插入到我的sqlite中,然后在listview中显示该数据并逐秒更新数据。 一切都是正确的,直到我发现如果我在底部导航中单击片段中的项目的位置过快,它将在应用程序对片段执行事务时崩溃。只有当我在该片段和其他4个片段中的多个片段之间单击时,才会发生这种情况。 所以我的

  • 我想用一个按钮在三个不同的位置改变图像的位置...用我的代码图像只移动了一个位置... ViewController.h ViewController.m }