Изображение на Android, сборщик мусора замедляется - PullRequest
0 голосов
/ 27 октября 2011

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

Использование всего изображения не вариант, потому что это даст исключение OutOfMemory,поэтому я внедряю собственную систему листов.У меня уже есть изображение, разрезанное на несколько частей на SD-карте, и 3 его варианта, низкого, среднего и высокого качества.

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

Все прекрасно в теории, и эта система уже хорошо работает в нашем приложении для iOS, но в Android она становится невыносимо медленной из-за сборщика мусора.

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

Каждый раз, когда пользователь переходит на следующую страницу, я вызываю следующее на старойрастровые изображения:

lowResBitmap.recycle ();lowResBitmap = null;

Есть ли лучший способ обрабатывать размещение и освобождение растрового изображения на Android?

РЕДАКТИРОВАТЬ: я забываю вызывать .recycle () для некоторых растровых изображений, теперь он не падаетв OOM больше, но он очень медленный (по сравнению с нашим приложением для iOS), потому что каждый раз, когда пользователь переворачивает страницу, Android многократно вызывает GC, и это замедляет мой поток рисования.

1 Ответ

0 голосов
/ 27 октября 2011

Независимо от того, вызываете ли вы recycle или нет в своем растровом изображении или нет, это не должно иметь никакого значения, поскольку переменная lowResBitmap является единственной ссылкой на экземпляр растрового изображения.

Из документации Android SDK :

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

Вы проверяли, чтобы вызывать System.gc(); напрямую, чтобы посоветовать сборщику мусора сделать это в определенное время?

Обновление (работает неудобно только с API11 + / Android 3:

Может быть, вы можете полностью запретить сборку мусора, повторно используя существующие растровые изображения при загрузке новых плиток. Я предполагаю, что все ваши плиткитакого же размера, поэтому этот подход был бы в идеале. Из того, что я понял, это можно сделать с помощью inBitmap BitmapFactory.Options .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...