1

フラグメント内にリストビューがあります。リストビューの各行には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:キャンバス:(Canvas.java:1270)android.graphics.Canvas.throwIfCannotDrawでリサイクルビットマップ[email protected] を使用しようとして でandroid.graphics.Canvas.drawBitmap(Canvas.java:1404)android.graphics.drawable.BitmapDrawable.draw(0120) android.view.View.View.draw(View.java:16184) at android.view.View.updateDisplay ListIfDirty(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.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)) at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.jav (ViewGroup.java:3573) android.view.View.View.ViewReplaceChildDisplayList(ViewGroup.java:3573)の にあるandroid.view.updateDisplayListIfDirty(View.java:15140) の は、 (ViewGroup.java:3593) android.view.View.View.ViewReplaceChildDisplayList android.view.View.View.View.View.ViewDateViewListFile(ViewGroup.java:3573)の (android.view.View.updateDisplayListIfDirty(View.java:15140)) でandroid.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593) でandroid.view.View.View.View.GetDisplayList(ViewGroup.java:3573) にandroid.view.View.updateDisplayListIfDirty(ビュー。(ViewGroup.java:3593) とandroid.view.View.updateDisplayListIfDirty(View.java: 15140) android.view.View.ViewDateDisplayListIfDirty(View.java:15140)で を表示します。 android.view.View.View.ViewReplaceChildDisplayList(ViewGroup.java:3593)の android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3573)android.view.ViewGroup.dispatchGetDisplayListでandroid.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3593) でandroid.view.View.updateDisplayListIfDirty(View.java:15140) (ViewGroup.java:3573) ででandroid.view.View.updateDisplayListIfDirty(View.java:15140)android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:281)で android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:287)で アンドロイドで 。 view.ThreadedRenderer.draw(ThreadedRenderer.java:322) android.view.ViewRootImpl.draw(ViewRootImpl.java:2615)android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107) でandroid.view.ViewRootImpl.performTraversalsでandroid.view.ViewRootImpl.performDraw(ViewRootImpl.java:2434) (ViewRootImpl.java:2067) で10でandroid.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:6013) android.view.Choreographer $ CallbackRecord.run(Choreographer.java:858) android.view.Choreographer.doCallbacks(Choreographer.java:670) android.view.Choreographer.doFrame(Choreographer.java:606) android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:844) android.os.Handler。

+0

あなたの質問を明確にすることはできますか? Ionは内部メモリまたはサーバーからイメージを取得し、イメージビューに設定するためにURIを取得します。クラッシュがビットマップリサイクルに関係しているかどうかはわかりません。フルログトレースをここに貼り付けてください。 –

+0

ビットマップを読み込んでいて、OutOfMemoryがクラッシュしていました。だから、新しい画像を画像ビューにロードする必要があるときはいつでも、ビットマップ(すでに画像ビューに割り当てられていた)によって使用されるメモリを解放したかったのです。しかし、これは、アクティビティの方向がポートレートからランドスケープに変わったときにクラッシュを引き起こしています。質問にスタックトレースを追加しました –

答えて

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

uriの画像が変更されている可能性があります。だから、毎回uriからロードする必要があります。以前のビットマップで使用されていたメモリを解放すると、OutOfMemoryクラッシュを回避するのに役立つと思いました。 –

関連する問題