Ответ 1
Документация впоследствии была обновлена с дополнительной информацией, которая касается вашего первоначального вопроса.
Сводка: использование этого флага больше не рекомендуется.
Android BitmapFactory.Options.inPurgeable
был рекомендован в разных местах как способ избежать исключений OutOfMemory в Android 2.x и более ранних версиях (Android 3.1 исправляет это).
Если inPurgeable
настолько велико, почему я никогда не хочу его использовать? Документация кажется очень легкой в деталях о том, что делает этот параметр:
Если для этого параметра установлено значение true, то результирующая растровая карта будет выделять свои пиксели таким образом, чтобы их можно было очистить, если системе необходимо восстановить память. В этом случае, когда нужно снова получить доступ к пикселям (например, растровое изображение вычерчено, вызывается getPixels()), они будут автоматически перекодированы
Кажется замечательным. Какой улов?
Документация впоследствии была обновлена с дополнительной информацией, которая касается вашего первоначального вопроса.
Сводка: использование этого флага больше не рекомендуется.
Если вы читаете свои растровые изображения из файловой системы, используя этот флаг, вы можете заставить Android открыть файл (по крайней мере в 4.0.4), чтобы перечитать его. После чтения более 1024 файлов вы достигнете предела открытых файлов и получите сообщение "Слишком много открытых файлов".
Вы можете наблюдать beahavior с помощью команды lsof
с корневого терминала и просматривать все открытые файлы.
Для повторного декодирования битмап должен иметь доступ к закодированным данным, либо путем обмена ссылкой на ввод, либо путем его копирования.
Если у вас больше нет доступа к закодированным данным, это может быть проблемой? Что, если вы были живыми растровыми изображениями декодирования из потокового ByteArray, и ваше приложение просто решает вернуть память, не приведет ли это к тому, что ваш Bitmap потеряет эти пиксели?
Этот флаг в настоящее время полностью игнорируется, что catch.
Обновление от @slodge: пожалуйста, любой, кто читает это и видит в нем правильный ответ, также читает комментарии - "Этот флаг в настоящий момент полностью игнорируется" является истинным только в некоторых случаях - в других случаях (например, при использовании decodeByteArray
на загруженные данные), то этот флаг не игнорируется и очень, очень полезен