исключение из памяти при использовании большого количества изображений с сенсором слушателя - PullRequest
0 голосов
/ 13 июня 2011

Я работаю над приложением с большим количеством изображений и использую прослушиватель датчиков, который я регистрирую в начале упражнения в диспетчере датчиков для обнаружения событий встряхивания и изменения изображений в зависимости от направления встряхивания.

Я прочитал значения события в onSensorChanged(SensorEvent event), чтобы использовать его в моем приложении:

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

Я отменяю регистрацию приемника датчика при приостановке действия, а также вызываю system.gc для сбора мусора.

Все работает хорошо, пока я не занимаюсь одним делом.

Когда я заканчиваю текущее действие и открываю другое действие (снова с прослушивателем датчика), приложение через некоторое время начинает выдавать исключение из-за недостатка памяти:

"OutOfMemoryException: размер растрового изображения превышает бюджет ВМ "

Обратите внимание, что размер кучи приложения никогда не превышает 4 МБ.

Еще одно наблюдение состоит в том, что приложение никогда не падает, если не используется приемник датчика, что заставляет меня думать, что, возможно, возникают утечки памяти при генерировании событий датчика и при загрузке нового действия из-за меньшего объема доступной памяти приложение дает OutOfMemoryException, когда в действии используются растровые изображения.

Так что, казалось бы, две возможные причины:

  1. изображения не переработаны должным образом http://code.google.com/p/android/issues/detail?id=8488
  2. каждый раз, когда происходит SensorEvent, где-то возникают утечки памяти, что уменьшает доступную память для приложения Android: чтение акселерометра без выделения памяти?

Я также использую решение, описанное в комментарии 51 здесь: http://code.google.com/p/android/issues/detail?id=8488

, чтобы утилизировать все, но это все еще вызывает проблемы с памятью.

Если вы можете сказать мне, как лучше всего использовать изображения в крупногабаритном приложении, как их переработать и подтвердить, действительно ли имеются утечки памяти при использовании прослушивателя датчика, или какие-либо предложения, которые мне следует искать в приложение, это будет очень полезно.

Ответы [ 2 ]

0 голосов
/ 13 июня 2011

К вашему сведению, вы можете использовать комбинацию SoftReference и HashMap для достижения лучшего контроля памяти в Bitmap. При использовании 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 */
}

Но, честно говоря, я испытал OutOfMemoryError даже использовал SoftReference<Bitmap>. Чтобы устранить эту ошибку, я сделал recycle() растровое изображение вручную.

0 голосов
/ 13 июня 2011

Для правильной переработки изображений, если это возможно, попробуйте использовать метод Bitmap.recycle (). Это происходит из-за того, что изображение фактически хранится в качестве эталона (в предварительной соте), а фактические данные распределяются с использованием собственной памяти.

В Honeycomb память для изображений распределяется в куче, так что это легко GCed. Кроме того, вы можете установить largeHeap = "true" (снова после соты).

...