2012-08-02 2 views
5

비트 맵을 포함하여 많은 정보를 가져 오는 사용자 지정보기가 있습니다. 이 드로잉을 비트 맵에 캐시하고 싶으므로 드로잉 작업과 계산을 반복하는 대신 onDraw 내에 하나의 비트 맵을 그릴 필요가 있습니다.안드로이드보기에서 비트 맵을 올바르게 할당 해제 할 위치는 어디입니까?

비트 맵을 더 이상 사용하지 않으면 재활용해야합니다. onDestroy() 또는 View 클래스에서 원격으로 비슷한 것은 없습니다. 이를 달성하기 위해 재정의 할 수있는 콜백 메서드가 있습니까?

public void <insert_callback_here>() { 
    cachedBitmap.recycle(); 
} 

애니메이션이 없습니다. 이것은 정적 이미지입니다. 이미지를 그리는 데는 많은 계산이 필요하므로 onMeasure()에서 한 번 해보십시오.

답변

7

나는 여기에 내 자신의 대답을하려고합니다. 재정의 할 적절한 방법은 onDetachedFromWindow입니다.안에 내 비트 맵 할당을 해제하고 너비 또는 높이가 변경된 경우 onMeasure 안에 다시 할당하십시오.

@Override 
protected void onDetachedFromWindow() { 
    super.onDetachedFromWindow(); 
    if (cachedBitmap != null && !cachedBitmap.isRecycled()) { 
     cachedBitmap.recycle(); 
     cachedBitmap = null; 
     cachedBitmapWidth = -1; 
     cachedBitmapHeight = -1; 
    } 
} 

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    int viewWidth = MeasureSpec.getSize(widthMeasureSpec);; 
    int viewHeight = MeasureSpec.getSize(heightMeasureSpec);; 

    if (cachedBitmapWidth != viewWidth || cachedBitmapHeight != viewHeight) { 
     if (cachedBitmap != null) { 
      cachedBitmap.recycle(); 
     } 
     cachedBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
     cachedBitmapWidth = viewWidth; 
     cachedBitmapHeight = viewHeight; 
     Canvas canvas = new Canvas(cachedBitmap); 
     // do drawings here.. 
    } 

    setMeasuredDimension(viewWidth, viewHeight); 
} 
+0

이것은 정확히 내가 필요한 것입니다. 추가하기 만하면 메모리가 충분하지 못하여 문제가 발생하여 비트 맵을 재활용 한 후 System.gc()도 실행했습니다. –

+0

좋은 점이 있지만 onCreate()에서 finish()를 호출하는 앱에주의해야합니다. 이렇게하면 메모리 누수가 발생할 수 있습니다 (https://medium.com/square-corner-blog/android-leak-pattern-subscriptions 참조). -in-views-18f0860aa74c). – RhetoricalRuvim

+0

또한 중요 : onMeasure() 및 onDraw() 내부에 아무 것도 할당하지 않는 것이 좋습니다. 예를 들어 레이아웃 계층에 따라 onMeasure()는 뷰의 최종 크기가 결정되기 전에 2 ~ 3 번 호출됩니다. onSizeChanged() 내부에서 다시 할당하는 것이 좋습니다. – RhetoricalRuvim

관련 문제