Я работаю над приложением с большим количеством изображений и использую прослушиватель датчиков, который я регистрирую в начале упражнения в диспетчере датчиков для обнаружения событий встряхивания и изменения изображений в зависимости от направления встряхивания.
Я прочитал значения события в 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, когда в действии используются растровые изображения.
Так что, казалось бы, две возможные причины:
- изображения не переработаны должным образом
http://code.google.com/p/android/issues/detail?id=8488
- каждый раз, когда происходит SensorEvent, где-то возникают утечки памяти, что уменьшает доступную память для приложения
Android: чтение акселерометра без выделения памяти?
Я также использую решение, описанное в комментарии 51 здесь:
http://code.google.com/p/android/issues/detail?id=8488
, чтобы утилизировать все, но это все еще вызывает проблемы с памятью.
Если вы можете сказать мне, как лучше всего использовать изображения в крупногабаритном приложении, как их переработать и подтвердить, действительно ли имеются утечки памяти при использовании прослушивателя датчика, или какие-либо предложения, которые мне следует искать в приложение, это будет очень полезно.