2012-07-21 5 views
1

메모리를 빨리 복원하기 위해 onDestroy에 다음 코드를 사용하여 큰 비트 맵을 재활용했습니다. 하지 않으면 OutOfMemory 오류로 인해 화면이 거의 회전하지 않아 응용 프로그램이 중단됩니다. 안드로이드는 메모리를 다루는 데 짜증이 난다.안드로이드 ICS 비트 맵 재활용

ImageView imgBG = (ImageView)findViewById(R.id.mainBG); 
if (imgBG != null) 
{ 
    ((BitmapDrawable)imgBG.getDrawable()).getBitmap().recycle(); 
    imgBG.setImageDrawable(null); 
} 
System.gc(); 

유감스럽게도 ICS가 변경되었습니다. 그들은 캐싱 리소스를 시작하고 비트 맵을 재활용하면 실제로 비트 맵이 캐시에 재활용됩니다. 안드로이드는 그것을 알아낼 수있을만큼 똑똑하지이며,이 결과 미래에 재활용 비트 맵을 사용하려고 : 그래서 여기

java.lang.RuntimeException: Canvas: trying to use a recycled bitmap [email protected] 
at android.graphics.Canvas.throwIfRecycled(Canvas.java:1047) 
at android.graphics.Canvas.drawBitmap(Canvas.java:1151) 
at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:400) 
at android.widget.ImageView.onDraw(ImageView.java:973) 
at android.view.View.draw(View.java:11014) 
at android.view.ViewGroup.drawChild(ViewGroup.java:3186) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2788) 
at android.view.ViewGroup.drawChild(ViewGroup.java:3184) 
[...] 

을 문제 야합니다. 재활용하면 ICS에서 충돌합니다. 그렇지 않으면 앱의 메모리가 부족합니다. 어떻게해야합니까? 실제로 작동하는 메모리를 해제하는 올바른 방법은 무엇입니까?

+0

나는이 캐싱은 아마 그냥 너무 공격적으로, 심지어 안드로이드 2.3에서 이루어집니다 (공유) 생각합니다. 그러나 내가 아는 한 XML 정의 비트 맵의 ​​경우에만 ** 수행합니다. decodeBitmap을 통해 비트 맵을로드 한 다음보기로 설정하려고 했습니까? 이 경우 Android는 시스템 캐시를 사용하지 않습니다. 비슷한 문제가있어 귀하의 경험을 기대 하듯이 어떻게 진행되는지 알려주세요. –

답변

-3

이 시도 :

ImageView imgBG = (ImageView)findViewById(R.id.mainBG); 
if (imgBG != null) 
{ 
    BitmapDrawable drawable = ((BitmapDrawable)imgBG.getDrawable()).getBitmap(); 
    imgBG.setImageDrawable(null); 
    drawable.recycle(); 
} 
System.gc(); 
+0

그게 바로 내가하고있는 일이고 내 질문은이 접근법이 왜 틀린 지 설명합니다. 비트 맵을 재활용 할 수 없습니다. 예외가 throw 된대로 –

+0

: UI 업데이트를위한 다른 스레드가 있습니까? 리사이클 된 비트 맵을 요구하고있다. 비트 맵을 drawable에 먼저 저장하고 null을 설정 한 다음 재활용합니다. – Superbiji

+0

추측을 그만하고 제 질문을 읽어보십시오. 'recycle()'이 실패하고 왜 그런 접근이 잘못된지를 설명합니다. –

관련 문제