2012-09-21 2 views
4

이 질문은 Do we have to explicitly recycle the bitmap if we don't need it?과 관련이 있습니다.필요없는 경우 ImageView 내부의 드로어 블을 파괴하는 방법은 무엇입니까?

ImageView에는 드로어 블이 있습니다. 사용자가 버튼을 클릭하면 ImageView에 새로운 드로어 블이 지정됩니다.

ImageView에 속한 오래된 드로어 블을 폐기해야합니까?

Drawable oriDrawable = imageView.getDrawable() 

// set callback to null 
oriDrawable.setCallback(null); 

// get the bitmap and recycle it 
((BitmapDrawable)oriDrawable).getBitmap().recycle(); 

위의 코드가 맞습니까? 가장 좋은 솔루션은 무엇입니까?

답변

3

이것은 일반적인 질문입니까, 아니면 메모리가 부족합니까? 나는 당신이 정말로 문제가 생길 때까지이 최적화를하지 않을 것이다.

일반적으로 크지 않은 드로어 블 폴더에서 비트 맵을로드하는 경우 (메가 바이트만큼 큼) 실제로 문제가 발생하지 않아야합니다.

먼저로드하는 애셋이 표시 위치에 가장 적합한 지 확인해야합니다. 예를 들어 이미지를 표시하는 영역이 1024x1024 크기의 이미지로 ImageView를 설정하지 않아도됩니다. 크기는 64x64입니다.

비트 맵 예산을 깨는 것은 일반적으로 알 수없는 크기의 이미지를로드하거나 위에서 설명한대로 단순히 이미지 크기를 잘못 설정 한 경우 ImageView를 자주 바꾸면 최적의 크기의 이미지에 문제가 발생하지 않습니다.

사실

+1

나는 OutOfMemoryException을 가지고 있으며 URL의 제안으로 그것을 고쳤다. 그러나 가능한 한 많이 사용하지 않는 드로어 블을 재활용해야하거나 새로운 드로어 블을 지정할 때 자동으로 소멸됩니다. – Freewind

+1

GC로 재활용 될 것이므로 재활용하지 않고 문제가 발생하는지 먼저 확인하려고합니다. 드로어 블 또는 비트 맵에 대한 추가 참조가 없도록하여 GC 자격을 얻으십시오. –

11

당신은 같은 것을 사용하여 시도해 볼 수도 있습니다 : imageViewImageView

Drawable drawable = imageView.getDrawable(); 
if (drawable instanceof BitmapDrawable) { 
    BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable; 
    Bitmap bitmap = bitmapDrawable.getBitmap(); 
    bitmap.recycle(); 
} 

입니다.

원본 대답 here.

+0

을하는 데 도움이 최적 http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

희망로드 비트 맵을 포함 안드로이드 교육에 큰 기사가 그것 않습니다 난 당신이 그 – Blackbelt

+0

을 제안 할 정확히 감사. 그리고 나는 가능한 한 큰 드로어 블을 재활용해야만하는지 확신하지 못합니까? 그렇다면 왜 안드로이드가 drawable에'recycle' 메소드를 제공하지 않는 걸까요? –

+0

무슨 뜻인지 모르겠어요 @blackbelt 당신은 – Freewind

관련 문제