Ответ 1
Вкратце, проблема в том, что при использовании BitmapFactory.decodeFile(String, Options)
тогда Android будет выделять 16 kB BufferedInputStream
, независимо от options.inTempStorage
.
Чтобы быть более сложным: BitmapFactory.decodeFile(String, Options)
является оберткой вокруг BitmapFactory.decodeStream(InputStream, Rect, Options)
, которая использует FileInputStream
. В реализации BitmapFactory.decodeStream(InputStream, Rect, Options)
есть этот код:
public static Bitmap decodeStream(InputStream is, Rect outPadding, Options opts) {
// ...
// we need mark/reset to work properly
if (!is.markSupported()) {
is = new BufferedInputStream(is, 16 * 1024);
}
// ...
}
Так как FileInputStream
markSupported()
возвращает false
, это означает, что независимо от options.inTempStorage
для вас будет создан BufferedInputStream
с буфером 16 kB, если вы используете BitmapFactory.decodeFile(String, Options)
.
Чтобы избежать этого выделения 16 kB, вы можете попробовать использовать BitmapFactory.decodeStream(InputStream, Rect, Options)
напрямую с InputStream
, для которого markSupported()
возвращает true
.
Я могу подумать о двух альтернативах, которые можно было бы рассмотреть:
- Используйте свой собственный
BufferedInputStream
с меньшим буфером - Используйте
AssetManager.AssetInputStream
как возвращаемыйAssetManager.open(...)
(см. мой ответ здесь о том, как его использовать). ЕгоmarkSupported()
возвращаетtrue
.
Первый вариант может не помочь, у вас все равно будет выделен массив byte [], но по крайней мере он находится под вашим контролем. Второй вариант может оказаться самым плодотворным, если ваши обстоятельства позволяют использовать этот подход.