1

조각 내 listview가 있습니다. listview의 각 행에는 imageview가 있으며 비트 맵 이미지를로드하고 있습니다. 비트 맵을 이미지 뷰의 태그로 설정했습니다. 다음에 null이 아닌 태그가있는 이미지보기가 발생하면 태그의 비트 맵을 재사용하고 이미지를 이미지로 다시로드합니다. 이로 인해 활동 방향이 변경되면 "캔버스 : 재활용 비트 맵 사용 시도 중 android.graphics.Bitmap"오류가 발생합니다. 왜 이런 일이 일어나는지 알 수 없었습니다. 도와주세요.Canvas : 조각의 구성 변경시 재활용 된 비트 맵 충돌을 시도합니다.

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.Canvas.throwIfCannotDraw (Canvas.java:1270) 에서 을 [email protected] 사용하려고 android.graphics.Canvas.drawBitmap (Canvas.java:1404) android.graphics.drawable.BitmapDrawable.draw (BitmapDrawable.java:544)의 android.widget.ImageView.onDraw (ImageView.java:1228)의 at android.view.View.draw (View.java:16184) android.view.View.updateDisplay에서 android.view.View.draw ListIfDirty (View.java:15180) android.view.View.draw (View.java:15954) at android.view.ViewGroup.drawChild (ViewGroup.java:3609) android.view.ViewGroup.dispatchDraw (ViewGroup.java:3399) at android.view.View.updateDisplayListIfDirty (View.java:15175) at android.view.View.draw (View.java:15954) at android.view.ViewGroup.drawChild (ViewGroup. java : 3609) android.widget.ListView.drawChild (ListView.java:3418) android.widget.AbsListView.dispatchDraw (AbsListView)의 에있는 android.view.ViewGroup.dispatchDraw (ViewGroup.java:3399)의 .java : 2615) android.widget.ListView.dispatchDraw (ListView.java:3413) android.view.View.draw (View.java:16187) at android.widget.AbsListView.draw (AbsListView.java : 4166) android.view.View.updateDisplayListIfDirty (View.java:15180) android.view.View.draw (View.java:15954) at android.view.ViewGroup.drawChild (ViewGroup.java:3609)) android.view.ViewGroup.dispatchDraw (ViewGroup.java:3399) android.view.ViewGroup.recreateChildDisplayList에서 android.view.View.updateDisplayListIfDirty (View.java:15175) 에서 (ViewGroup.jav에서 A : 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.View.updateDisplayListIfDirty (View.java:15140)에서 android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:3573) 에서 ,android.view.View.ViewGroup.recreateChildDisplayList (ViewGroup.java:3593) (android.view.View.ViewdateDisplayListIfDirty (View.자바 : android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:3593에서 15140) ) android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:3573에서 ) android.view.View.updateDisplayListIfDirty (View.java에서 : android.view.ViewGroup.recreateChildDisplayList (ViewGroup.java:3593) android.view.ViewGroup.dispatchGetDisplayList (ViewGroup.java:3573) android.view.View.updateDisplayListIfDirty에서 에서 에서 15140) (View.java:15140) android.view.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) 에서 7백45경1천5백15조5백36억9천1백36만3천2백10에서 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 충돌을 피할 수 있다고 생각했습니다. –