Для меня это очень болезненная тема (работа с Bitmap) в Android! В своем приложении я давно с ней борюсь. Сейчас я полностью отказался от «bmp.recycle()» и хранения жестких ссылок на Bitmap, только WeakReference.
Хотелось бы узнать Вы пробовали данный метод на «боевых» приложениях в маркете?
Если бы нормально работало, с хаком должно 48Мб взять.
Хак не работает. Просто, видимо, прошивка для симулятора собрана с бОльшим размером хипа на приложение.
Полностью эквивалентно тому, что память заняла JNI-библиотека.
Если съесть слишком много памяти, могут быть затронуты другие работающие приложения.
Например, будут закрыты те фоновые приложения, которые в другом случае остались бы висеть в фоне.
Я так понимаю, что данные нароботки использованы в CoolReader?
Если да, то можно сказать, что технология работает отлично, потому что падений CoolReader я не замечал.
Правда были проблемы с отображением страниц (черный цвет) в Nook Touch, так что интересно узнать.
Для решения аналогичной проблемы разместил большие картинки в assets/img и работаю с ними напрямую через BitmapFactory.decodeStream().
Далее проверяю и сравниваю размеры изображения и размеры экрана. Если первые больше вторых, уменьшаю картинку:
Bitmap.createScaledBitmap()
Такой подход избавляет от зоопарка картинок для разных размеров экранов и не забивает память. По окончанию использования, высвобождаю память.
Спасибо за способ — тоже очень актуальна эта проблема, обязательно попробую у себя.
Кстати, через JNI можно без каких-либо последствий для системы занять примерно 13% от всей памяти устройства — после достижения этого предела начинают убиваться фоновые процессы.
Словил похожие грабли при попытке создать полноэкранную анимацию из нескольких десятков фреймов (размером ~640*480). Падало с нехваткой памяти на 11-м кадре.
В итоге, решил проблему загрузив картинки в качестве текстур в OpenGL, теперь 40 кадров поместилось в память отлично.
Это тема для целой статьи, если в двух словах, то:
В OpenGL окружении создается полигон с текстурой, в память OpenGl грузим все фреймы анимации в виде текстур (256*256 или 512*512, размер должен быть обязательно кратный степени 2) соотношение стороно задается не размерами текстуры а размерами полигона, далее в зависимости от необходимой скорости анимации, переключаем текстуры на полигоне через заданные промежутки времени.
Перед выходом со страницы или смены анимации на другую, очищаем GL память от прошлого набора текстур.
Android SDK: боремся с ограничением размера памяти для картинок