Во-первых, я понимаю вопросы относительно java.lang.OutOfMemoryError
и растровые изображения уже заданы несколько раз раньше. Я также проверил страницу Displaying Bitmaps Efficiently.java.lang.OutOfMemoryError при преобразовании более 100 строк в байт-массивы
Мой случай использования:
Я храню два разных размера Bitmaps как строки в базе данных SQLite. Первый размер битмапов составляет 50% ширины экрана, а второй размер - 100% от ширины экрана.
Я использую RecyclerView, который отображает изображения в ImageViews, которые являются либо 50%, либо 100% ширины экрана, поэтому загружаемые растровые изображения не больше, чем они должны быть, и они должны соответствовать размерам до изображения извлекаются из базы данных.
Я также загружаю растровые изображения с помощью AsyncTask.
У меня есть более 180 различных элементов в RecyclerView, поэтому я создаю в общей сложности более 360 битмапсов (т. Е. Числовое изображение * theDifferentSizesOfEachImage). Я coverting строковой версии изображений в массив байт с помощью этого кода: byte [] byteArray = Base64.decode(encodedString, Base64.DEFAULT);
Проблемы
Деятельности удалась загрузить более около 170 различных изображений без encurring в java.lang.OutOfMemoryError
, если я не перезапущен же Действия (например, загрузите Activity, затем заново создайте Activity, щелкнув ее снова в навигационном ящике, а затем повторите этот процесс) и понесли java.lang.OutOfMemoryError
, преобразовывая строки в байтовые массивы.
Я преобразование массива в Bitmap, используя библиотеку Glide, используя следующий код:
Bitmap bitmap = Glide.with(context).load(byteArray).asBitmap()
.dontTransform().dontAnimate().skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE).into(-1, -1).get();
Мой вопрос в ореховой скорлупе
Как избежать java.lang.OutOfMemoryError
происходит в то время как Я преобразовываю строки в байтовые массивы?
Примечание
После создания растрового изображения с помощью Glide я звоню рециркуляцию() на данном Bitmap, а затем установить его в null
.
Я также уже использую android:largeHeap="true"
в моей Android манифеста
Заранее спасибо
Редактировать
Вот как я создаю Bitmap строк:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.WEBP,100, baos);
byte [] b =baos.toByteArray();
String bitmapString = Base64.encodeToString(b, Base64.DEFAULT);
Почему бы вам не сжать его перед хранением ... –
Спасибо за ваш ответ. Если вы ссылаетесь на сжатие растровых изображений, я уже делаю это, я отредактировал свой вопрос, и вы можете увидеть, как я сжимаю растровые изображения, прежде чем преобразовывать их в строки –
«Я храню два разных растровых изображения как строки в базе данных SQLite» - - Зачем? Храните их в виде файлов с именами файлов в базе данных. Или сохраните их как столбцы BLOB, чтобы, по крайней мере, устранить преобразование «String». – CommonsWare