Советы по обработке растровых изображений Android
Теперь вот несколько советов, которым вы можете следовать и которых можно избежать, из-за нехватки памяти в приложении Android.
- Всегда использоватьКонтекст деятельности вместо контекста приложения.потому что контекст приложения не может быть сборщиком мусора.И освободите ресурсы, когда ваша деятельность закончится.(жизненный цикл объекта должен совпадать с жизненным циклом).
2.Когда активность заканчивается.Проверьте HEAP DUMP (инструмент анализа памяти в Android Studio).
Если в HEAP DUMP есть объекты из завершенного действия, значит, утечка памяти.проверьте ваш код и выясните, что вызывает утечку памяти.
Всегда используйте inSampleSize
Теперь, что такое inSampleSize?с помощью inSampleSize вы на самом деле говорите декодеру не захватывать каждый пиксель в памяти, а вместо этого подобразца изображения.Это приведет к тому, что в память будет загружено меньшее количество пикселей, чем исходное изображение.Вы можете указать декодеру захватывать каждый 4-й пиксель или каждый второй пиксель исходного изображения.если inSampleSize равно 4. Декодер вернет изображение, которое составляет 1/16 числа пикселей в исходном изображении.
так сколько памяти вы сохранили?рассчитать:)
Чтение размеров растрового изображения перед загрузкой в память.
Как чтение размеров растрового изображения перед загрузкой изображения в память может помочь вам избежать ошибки памяти
?Давайте научимся
использовать inJustBounds = true
вот методика, с помощью которой вы можете получить размер изображения, загружая его в память
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
String imageType = options.outMimeType;
Вышеуказанный фрагмент кода не даст нам никакого изображения / растрового изображения.для растрового объекта будет возвращаться ноль.но он определенно вернет ширину и высоту этого изображения.который является R.id.myimage.
Теперь у вас есть ширина и высота изображения.Вы можете увеличивать или уменьшать изображение на основе следующих факторов:
Если вы используете цветной канал RGB_565, который использует 2 байта на пиксель.половина выделения памяти для того же разрешения:)
Используйте свойство inBitmap для утилизации.
Не создавайте статический объект Drawable, так как его нельзя собрать мусором.
Запрос большой кучи в файле манифеста.
Используйте несколько процессов, если вы выполняете много обработки изображений (задача с интенсивным использованием памяти), или используйте NDK (Native Development используя c, c ++)