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