2010-12-15 2 views
0

큰 비트 맵을 많이 사용하는 갤러리 (전체 화면, wvga)를 표시 할 때 메모리 문제가 자주 발생합니다. 이것은 재활용되지 않는 비트 맵과 관련 있다고 가정합니다. 비트 맵을 언제/어떻게 강제로 재활용 할 수 있습니까?갤러리보기가있는 Android SimpleCursorAdapter에서 비트 맵을 언제/안전하게 재활용 할 수 있습니까?

또한 simpleCursorAdapter의 getView 메소드에서 convertView는 항상 null임을 알았습니다. 이전 뷰가 재활용되지 않는다고 가정합니다. 앞뒤로 스크롤 할 때마다 매번 새로운보기가 생성됩니다. 그러나 앞뒤로 스크롤해도 메모리 부족 문제가 발생하지 않으며 총 이미지 수가 충분히 클 경우에만 발생합니다.

ListView에서 동일한 어댑터를 사용하면보기가 재활용되므로 갤러리에 문제가있는 것으로 보입니다.

보기 및/또는 비트 맵을 강제로 재생하려면 어떻게해야합니까? 갤러리 크기와 비트 맵 품질을 줄이지 않고도 메모리를 관리 할 수있는 다른 방법은 무엇입니까?

+0

'purgeable'과 같은 다양한 비트 맵 옵션을 사용해 보셨습니까? 갤러리에 사전 크기 조정 또는 고품질 이미지를 사용하고 있습니까? 메모리 관리를위한'SoftReference' /'WeakReference'를 본 적이 있습니까? –

답변

-2

절대 Bitmap을 포함해야합니다. 그러나 일 수 있으며, OutOfMemory 오류가 발생하면 도움이됩니다. 그러나 비트 맵이 getPixels() 또는 setPixels()라는 경우 예외가 발생합니다, 아무것도 그릴 수 없기 때문에

(javadoc 내에서), 더 이상 필요하지 않습니다하지 그것을 할 때까지. 이 작업을 되돌릴 수 없으므로 을 호출해야합니다. 비트 맵을 더 이상 사용하지 않아야합니다. 귀하의 경우에는

, 난 당신이해야 가정 : 비트 맵 BitmapFactory.Options.inSampleSize 또는 MediaStore.Images.Thumbnails을 열 수 있습니다

  • 사용 엄지 손가락을
  • 메모리에만 최대 한 크기의 이미지 (어쩌면 당신에 미리로드 된 적이
  • 여유분이 있습니다)
+1

맞아요, 당신은 * 필요 *하지 않습니다,하지만하지 않으면 귀하의 응용 프로그램이 충돌합니다. 정확히 어떻게 "필요성"을 정의합니까? –

+0

"필요성"에 대한 Google의 정의가 다릅니다. pre-HC에서 비트 맵을 재활용해야합니다. – Raz

0

예를 들어 임시 비트 맵이있는 작업에서와 같이 비트 맵을 더 이상 사용하지 않을 것이라고 확신하는 경우 recycle()을 사용할 수 있습니다. 그러나 ... 예 : BitmapFactory.Options를 사용할 수 있습니다.

BitmapFactory.Options bitmapOptions = new BitmapFactory.Options(); 
bitmapOptions.inPurgeable=true; 

Bitmap bitmapTemp = BitmapFactory.decodeResource(getResources(), R.drawable.intro, bitmapOptions); 

무엇을합니까? inPurgeable 옵션은 시스템에 메모리가 필요하고 비트 맵이 유용하지 않으면 시스템이이 메모리 할당을 자체적으로 재활용한다는 것을 나타냅니다. 어떤 이유로 BitmapFactory로 이미지를로드 할 수없는 경우 Recycle()을 사용할 수 있으며 garbage collector를 호출 한 다음 system.gc()를 호출하는 것이 좋습니다. 예를 들어 게임을 개발할 때 유용합니다. 가비지 컬렉터는 시스템에 메모리가 부족할 때 활성화되며, 중요한 밀리 초를 소모합니다. 비트 맵은 매우 신중해야합니다. 앱에서 사용하는 "일반"메모리에는 저장되지 않으며 Android 3.0을 사용하지 않는 한 모든 앱에서 사용하는 "일반"메모리에 저장됩니다. 메모리 누수가 발생하여 힙을 찾을 수없는 경우 ... 코드로드 및 비트 맵 사용을 살펴 봐야합니다. 도움이 되길 바랍니다.

관련 문제