Когда можно / можно утилизировать растровое изображение в Android SimpleCursorAdapter с представлением галереи? - PullRequest
0 голосов
/ 15 декабря 2010

При отображении галереи с большим количеством больших растровых изображений (fullscreen, wvga) у меня довольно часто возникают проблемы с памятью. Я предполагаю, что это связано с тем, что растровые изображения не перерабатываются. Когда и как я могу принудительно использовать растровые изображения?

Я также заметил, что в методе getView simpleCursorAdapter convertView всегда имеет значение null. Я предполагаю, что это означает, что старый взгляд не переработан? Даже при прокрутке назад и вперед каждый раз создается новое представление. Однако прокрутка назад и вперед не вызывает проблем с нехваткой памяти, что происходит только тогда, когда общее количество изображений достаточно велико.

При использовании того же адаптера с ListView представления перерабатываются, поэтому, похоже, проблема в приложении Gallery.

Что можно сделать, чтобы принудительно утилизировать виды и / или растровые изображения? Что еще я могу сделать, управляя памятью, не уменьшая размер галереи и качество растрового изображения.

Ответы [ 2 ]

0 голосов
/ 20 января 2012

Вы можете использовать recycle(), если уверены, что вы больше не будете использовать растровое изображение, например, при любой операции с временным растровым изображением. Но ... Вы можете использовать BitmapFactory.Options, например:

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

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

Что это делает? опция inPurgeable будет предполагать, что, как только системе понадобится память и ваше растровое изображение больше не будет полезным, система сама перезапустит это распределение памяти. Если по какой-либо причине вы не можете загрузить изображение с помощью BitmapFactory, тогда вы можете использовать Recycle (), и рекомендуется вызывать сборщик мусора, а затем с помощью system.gc (), это полезно, если вы разрабатываете, например, игру, потому что когда сборщик мусора активируется, когда в вашей системе недостаточно памяти, он потребляет несколько значительных миллисекунд. Вы должны быть очень осторожны с растровыми изображениями, они не хранятся в «обычной» памяти, используемой вашим приложением, они хранятся в «общей» памяти, используемой всеми вашими приложениями, если вы не используете Android 3.0. Если вы обнаружили утечку памяти и не можете ее найти, глядя на кучу ... вам следует взглянуть на загрузку кода и использование растровых изображений. Надеюсь, это поможет.

0 голосов
/ 15 декабря 2010

Вы никогда не нуждаетесь в , чтобы переписать Bitmap.Тем не менее, вы можете сделать это, и это поможет, если у вас есть OutOfMemory ошибки.Но не делайте этого, пока растровое изображение больше не понадобится, потому что (из javadoc)

будет выдано исключение, если вызывается getPixels() или setPixels(), и ничего не будет рисовать.Эту операцию нельзя отменить, поэтому ее следует вызывать только в том случае, если вы уверены, что для растрового изображения больше нет использования.

В вашем случае, я полагаю, вам следует:

  • использовать большие пальцы, которые являются растровыми изображениями, открытыми с BitmapFactory.Options.inSampleSize или MediaStore.Images.Thumbnails
  • В памяти может быть не более одного полноразмерного растрового изображения (возможно, предварительно загруженногомогу себе позволить)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...