2011-06-13 8 views
0

많은 이미지가 있고 액티비티의 시작 부분에 센서 리스너를 사용하여 센서 이벤트를 감지하고 이미지를 변경하는 센서 리스너를 사용하는 앱을 개발 중입니다. 쉐이크 방향에 따라.센서 리스너로 많은 수의 이미지를 사용할 때 outfmemoryexception

나는 내 응용 프로그램에서 사용하기 위해 onSensorChanged(SensorEvent event)의 이벤트 값을 읽어

public void onSensorChanged(SensorEvent event){ 
    accX = event.values[0]; 
    accY = event.values[1]; 
    accY = event.values[2]; 
} 

나는 활동의 일시 정지에 센서 리스너의 등록을 취소하고 또한 가비지 컬렉션으로 System.gc를 호출합니다.

모든 것이 단일 활동을 수행 할 때까지 잘 작동합니다.

I는 현재 활동을 완료하는 경우와, 응용 프로그램이 잠시 후 메모리 예외로부터 제공 시작 (다시 AA 센서 수신기를 갖는) 다른 활동을여

"에서 OutOfMemoryException : 비트 맵 크기 는 VM 예산 초과"

응용 프로그램의 힙 크기는 4MB를 넘지 않습니다.

센서 리스너를 사용하지 않으면 응용 프로그램이 충돌하지 않으므로 센서 이벤트가 생성되고 새로운 활동이로드 될 때 메모리 누수가 발생할 가능성이 있다고 생각됩니다. 활동에 비트 맵이 사용될 때 OutOfMemoryException을 제공합니다.

그래서 겉으로는 두 가지 이유 : 이미지가 제대로 재활용되지

  1. http://code.google.com/p/android/issues/detail?id=8488
  2. 응용 프로그램 Android: reading accelerometer without memory allocation?
  3. 에 사용 가능한 메모리를 감소시키는 SensorEvent가있을 때마다, 어딘가에 메모리 누수가

또한 주석 51에 설명 된 솔루션을 사용하고 있습니다. http://code.google.com/p/android/issues/detail?id=8488

모든 것을 재활용하지만 여전히 메모리 문제가 발생합니다.

대형 응용 프로그램에서 이미지를 사용하는 가장 좋은 방법은 센서를 사용하는 동안 실제로 메모리 누수가 있는지 확인하고 재활용하는 방법이나 내가 찾아야 할 제안 응용 프로그램, 정말 도움이 될 것입니다.

답변

0

가능하면 이미지를 올바르게 재활용하려면 Bitmap.recycle() 메소드를 사용해보십시오. 이것은 이미지가 실제로 참조로 유지되기 때문에 (실제 벌집 형태로) 실제 데이터는 기본 메모리를 사용하여 할당됩니다.

허니 콤에서는 이미지 용 메모리가 힙에 할당되므로 쉽게 GC 할 수 있습니다. 또한 largeHeap = "true"(다시 Honeycomb)를 설정할 수 있습니다.

0

참고로 비트 맵에서 더 나은 메모리 제어를 위해 SoftReferenceHashMap의 조합을 사용할 수 있습니다. SoftReference을 사용하면 메모리가 충분하지 않을 때 개체를 더 이상 참조하지 않아도 메모리가 해제됩니다.

일반적인 예 : 정직하지만

HashMap<String, SoftReference<Bitmap>> cache; 
... 
Bitmap bitmapToRead = cache.get(key).get(); 
if (bitmapToRead == null){ 
    cache.put(key, new SoftReference<Bitmap>(bitmap)); // bitmap from Storage for example 
    /* your operation */ 
}else{ 
    /* your operation on bitmapToRead */ 
} 

, 난 사용 SoftReference<Bitmap>OutOfMemoryError을 경험했다. 이 오류를 극복하기 위해 내가 수행 한 작업은 recycle() 비트 맵을 수동으로 수행하는 것입니다.

관련 문제