2011-12-15 5 views
0

메뉴가있는 애플리케이션이 있습니다. 메뉴 항목은 ViewAnimator의 스크린 샷입니다. 모든 것이 잘 작동합니다.Android 3.0에 내장 된 드로잉 캐시의 메모리를 비울 수 없습니다.

layout.destroyDrawingCache(); 
    bm.recycle(); 
    bm = null; 

그러나 unfortunatelly :

// Drawing cache is off, so build it manually and create scaled bitmap 
    layout.buildDrawingCache(); 
    Bitmap bm = layout.getDrawingCache(); 
    Bitmap bm_small = Bitmap.createScaledBitmap(bm, item_width, item_height, true); 

을 동일한 기능에서 내가 스크린 샷을 만드는 데 사용되는 모든 메모리를 해제하려고 : 많은 예에서 작성된 나는 그리기 캐시를 사용하여,이 간단한 스니 플릿으로 screeshots을 가비지 수집기가이 비트 맵 메모리를 비우지 않습니다. 또한 HPROF 메모리를 사용하여 해방 할 수없는 Bitmap에 대한 참조를 찾았지만 성공하지 못했습니다. 중요한 정보는 Honeycomb Android 3.0 용으로 개발 중이므로 스크린 샷이 상당히 크다는 것입니다. 모든 스크린 샷에는 약 3MB의 메모리가 필요하며 무료로 사용하지 마십시오.

이 예제에서는 재활용이 작동하지 않는 이유를 알지 못합니다. 안드로이드 3.0 허니 콤 + 하드웨어 가속 활성화 + 큰 힙 사용 + 드로잉 캐시 사용. 내가 발견 한 어떤 힌트도 도움이되지 않습니다.

제발, 당신은 왜 recycle이이 경우에 작동하지 않는지 설명 할 수 있습니까? 어떤 도움을 주시면 감사하겠습니다.

답변

0

예,이 문제가있었습니다. 비트 맵 자체를 해제하지 않기 때문에 매우 나쁜 행동입니다. 가장 좋은 조언은 더 작은 비트 맵 타일을 사용하는 것입니다.

그리고 다른 조언은 데이터 객체를 저장하는 데 SoftReference<Bitmap>을 사용하는 것입니다. SoftReferenced 객체는 메모리가 필요할 때 스스로 삭제합니다. 조심스럽게도, 누락 된 물체로 감을 수 있습니다.

그러나 비트 맵 방법은 결함이 있습니다.

+0

답변 해 주셔서 감사합니다. 내가 아는 한 전체 레이아웃에서 스크린 샷을 만들어야하기 때문에 더 작은 비트 맵을 사용할 수 없습니다. 그리고 SoftReference 솔루션은 비트 맵에 대한 참조를 저장하지 않기 때문에 여기에 적용 할 수 없습니다. / –

관련 문제