2011-06-14 6 views
4

SD 카드에서 비트 맵을 많이 사용하는 앱이 있습니다. 나는 99 % 애플 리케이션은 이러한 재활용하지 않고 파괴 절대 확신 해요. 그들은 모두 LRU 캐시 (commons-collections)에 할당되어 LRU 캐시에서 제거 될 때 재활용됩니다. 나머지는 onDestroy()에 재활용됩니다.안드로이드 비트 맵, 재활용 및 힙 조각화

그럼에도 불구하고 여전히 문제가 있습니다. 만약 내가 시작/중지/시작/... 내 애플 리케이션을 여러 번, 나는 메모리 오류 항상 빠져 나간다.

이것에 대한 나의 이론은 w/android의 비 압축 힙을 사용해야한다는 것입니다. 여러 번 실행 한 후에는 힙이 조각화되어 사용 가능한 메모리는 충분하지만 비트 맵을로드 할만큼 큰 연속 된 덩어리는 없습니다. 어쨌든 그것은 이론입니다.

나는 onDestroy() (android.os.Process.killProcess())에서 내 프로세스를 죽임으로써이를 "해결"했습니다. 이것은 문제를 해결하지만, 완료해야 할 다른 스레드와 서비스가 있기 때문에 그 자체의 다른 이슈를 소개합니다. 그런 모든 것을 멋지게 기다리는 것은 실용적이지 않습니다. 말할 것도없이 나는 이것이 단지 나쁜 행동이라는 것을 이해합니다.

이 주제에 대한 모든 게시물 등을 읽었지만 좋은 해결책이 없습니다. Thumbnails.getThumbnail()을 사용하고 있으므로 이미 이미지의 축소 버전을 사용하고 있습니다. 그들을 서브 샘플링하면 이미지 품질이 매우 떨어집니다.

나는 8 개의 "미니"썸네일과 36 개의 "마이크로"썸네일의 캐시를 유지하므로 한 번에 그 메모리보다 더 많은 메모리를 갖고 있지 않습니다. 이것들은 모두 아주 약간의 megs에 꼭 맞아야한다.

모든 아이디어/팁/포인터가 높이 평가됩니다. 나는 이것에 관한 나의 지혜의 끝에있다.

답변

2

onDestroy()으로 재활용한다고 말하지만, 아마도 onPause()으로 재활용해야하나요? 오리엔테이션을 전환 할 때 메모리 부족 문제가 발생하여 onPause()에서 재활용을 수행하여 문제가 해결되었습니다.

그냥 생각해보십시오. 문제가 해결 될지 확실하지 않습니다.

+0

감사합니다. 문제가 해결되지 않았지만 좋은 습관으로 보입니다. 나는 여전히 비트 맵을 참조하는 다른 객체에 문제를 일으킬 것이라고 생각 했으므로 그렇게하지 않는 것 같습니다. –