首页 文章

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

提问于
浏览
2

我在片段中有一个列表视图 . listview的每一行都有imageview,我正在加载位图图像 . 我将位图设置为imageview的标签 . 下次遇到带有非null标签的图像视图时,我正在回收标签中的位图并将图像重新加载到其中 . 这会导致崩溃“Canvas:尝试使用循环位图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:Canvas:尝试在android.graphics.Canvas.drawBitmap(Canvas)的android.graphics.Canvas.throwIfCannotDraw(Canvas.java:1270)中使用回收的位图android.graphics.Bitmap@31a3918 . java:1404)在android.view.draw.draw(View.java:16184)的android.widget.ImageView.onDraw(ImageView.java:1228)的android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:544) )在android.view.View.View.View.draw(View.java:15954)的android.view.View.View.View.View.Start(View.java:15954)上的android.view.View.View.View.Ja上播放android.view.View.updateDisplayListIfDirty(View.java:15180) .ViewGroup.dispatchDraw(ViewGroup.java:3399)位于android.view.View.View.Still((View.java:15175)的android.view.View.draw(View.java:15955)android.view.ViewGroup.drawChild( ViewGroup.java:3609)在Android.widget.AbsList.dava上的android.widget.ListView.DispatchDraw(ViewGroup.java:3399)的android.widget.ListView.drawChild(ListView.java:3418)(AbsListView.java:2615) )在android.widget.ListView位于android.view.A的移动设备上的.dispatchDraw(ListView.java:3413)( . View.java:16187),android.view.Ad上的android.widget.AbsListView.draw(AbsListView.java:4166) . (查看 . java:15180)在android.view.View.draw.draw(View.java:15954)的android.view.ViewGroup.drawChild(ViewGroup.java:3609)android.view.ViewGroup.dispatchDraw(ViewGroup.java:3399)at Android.view.View.View.View.View.View.View.View.View.View.View.View.View.View.View.View.View.View.View.View上的android.view.View.RecreplayChisDisplayList(ViewGroup.java:3593)的android.view.View.updateDisplayListIfDirty(View.java:15175)位于android.view.View.View.Ap的播放器上的android.view.View.View.Ap的播放器中的.updateDisplayListIfDirty(View.java:15140) . java:15140)在android.view.View.View.View.View.eddate的android.view.ViewGroup.DispatchGetDisplayList(ViewGroup.java:3573)的android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)在Android.view.View.View.Av上的android.view.View.View.DatplayListIfDirty(View.java)的android.view.ViewGroup.DispatchGetDisplayList(ViewGroup.java:3573)的android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)上的DisplayListIfDirty(View.java:15140) :15140)at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)at android.view.View.updateDisplayListIfDirty(View.java:15140)at android .view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593)位于android.view.View.View.View.View.View.View上的android.view.View.上的Android.view.View.DisplayListIfD(Play.java:15140)上的android.view.View . 在Android.view.View.View.recreateChildDisplayList(ViewGroup.java)上的android.view.View.updateDisplayListIfDirty(View.java:15140)上的android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)中重新创建了孩子显示列表(ViewGroup.java:3593) :3593)在android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)at at Android.view.ThreadedRenderer的android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:281)android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:287)的android.view.View.updateDisplayListIfDirty(View.java:15140) .draw(ThreadedRenderer.java:322)位于android.view.ViewRootImpl.performDvers(ViewRootImpl.java:2434)的android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2434)处的android.view.ViewRootImpl.draw(ViewRootImpl.java:2615) . java:2067)在android.view.ViewRootImpl上的android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107)在Android.view.Choreographer $ TraversRecord.run(Choreographer.java :858)在Android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:844)的android.view.doCallbacks(Choreographer.java:670)android.view.Choreographer.doFrame(Choreographer.java:606)在android.os.Handler .

1 回答

  • 0
    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.
    

相关问题