Я хочу показать растровое изображение в ImageView с SD-карты, которая уже хранится. После запуска моего приложения происходит сбой и появляется ошибка OutOfMemoryError :
(java.lang.OutOfMemoryError: Не удалось выделить 23970828 байт с 2097152 свободных байтов и 2 МБ до OOM)
Я понятия не имею, или почему это из памяти. Я думаю, что мой размер изображения очень большой, поэтому я попытался изменить его.
Iterator<String> it = imageArray.iterator();
while (it.hasNext()) {
Object element = it.next();
String objElement = element.toString();
Log.e("objElement ", " = " + objElement);
final ImageView imageView = new ImageView (getContext());
final ProgressBar pBar = new ProgressBar(getContext(), null,
android.R.attr.progressBarStyleSmall);
imageView.setTag(it);
pBar.setTag(it);
imageView.setImageResource(R.drawable.img_placeholder);
pBar.setVisibility(View.VISIBLE);
if (objElement.endsWith(mp3_Pattern)) {
Log.e("Mp3 ", " ends with ");
pBar.setVisibility(View.GONE);
imageView.setImageResource(R.drawable.audio_control);
}
if (objElement.endsWith(png_Pattern)) {
Bitmap bitmap = BitmapFactory.decodeFile(objElement);
int size = Math.min(bitmap.getWidth(), bitmap.getHeight());
int x = (bitmap.getWidth() - size) / 2;
int y = (bitmap.getHeight() - size) / 2;
Bitmap bitmap_Resul = Bitmap.createBitmap(bitmap, x, y, size, size);
Log.e("bitmap_Resul "," = "+ bitmap_Resul);
if (bitmap_Resul != bitmap) {
bitmap.recycle();
}
imageView.setImageBitmap(bitmap_Resul);
Log.e("png_Pattern ", " ends with ");
Log.e(" bitmap "," = " + bitmap);
}
holder.linearLayout.addView(imageView);
holder.linearLayout.addView(pBar);
Журнал кошачьей информации:
08-27 14:11:15.307 1857-1857/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.tazeen.classnkk, PID: 1857
java.lang.OutOfMemoryError: Failed to allocate a 23970828 byte allocation with 2097152 free bytes and 2MB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:812)
at android.graphics.Bitmap.createBitmap(Bitmap.java:789)
at android.graphics.Bitmap.createBitmap(Bitmap.java:709)
at android.graphics.Bitmap.createBitmap(Bitmap.java:634)
at com.example.tazeen.classnkk.AllPosts_Page$MyListAdapter.getView(AllPosts_Page.java:357)
at android.widget.AbsListView.obtainView(AbsListView.java:2347)
at android.widget.ListView.makeAndAddView(ListView.java:1864)
at android.widget.ListView.fillDown(ListView.java:698)
at android.widget.ListView.fillFromTop(ListView.java:759)
at android.widget.ListView.layoutChildren(ListView.java:1659)
at android.widget.AbsListView.onLayout(AbsListView.java:2151)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2086)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1843)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
at android.view.Choreographer.doCallbacks(Choreographer.java:580)
at android.view.Choreographer.doFrame(Choreographer.java:550)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5257)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
android
android-bitmap
androidTag
источник
источник
Ответы:
OutOfMemoryError - это наиболее распространенная проблема, возникающая в Android, особенно при работе с растровыми изображениями. Эта ошибка выдается виртуальной машиной Java (JVM), когда объект не может быть выделен из-за недостатка места в памяти, а также сборщик мусора не может освободить некоторое пространство.
Как отметил Алексей, вы можете добавить нижеприведенные сущности в свой файл манифеста
android:hardwareAccelerated="false"
,android:largeHeap="true"
это будет работать для некоторых сред.Вы должны обязательно прочитать некоторые из концепций разработчика Android, особенно здесь: Эффективное отображение растровых изображений
Прочитайте все 5 тем и перепишите свой код еще раз. Если это все еще не работает, мы будем рады видеть, что вы сделали неправильно с учебным материалом.
Вот некоторые из возможных ответов для такого типа ошибок в SOF
Android: BitmapFactory.decodeStream () не хватает памяти с файлом 400 КБ с 2 МБ свободной кучи
Как решить проблему java.lang.OutOfMemoryError в Android
Android: java.lang.OutOfMemoryError
java.lang.OutOfMemoryError
Решение для OutOfMemoryError: размер растрового изображения превышает бюджет виртуальной машины
Редактировать: из комментариев @cjnash
Для тех, у кого все еще были сбои после добавления этой строки, попробуйте вставить свое изображение в папку res / drawable-xhdpi / вместо res / drawable /, и это может решить вашу проблему.
источник
Вы пытались добавить это в свой манифест под приложениями?
android:largeHeap="true"
?нравится
источник
Для меня проблема заключалась в том, что мой файл .png распаковывался, чтобы быть действительно огромным растровым изображением в памяти, потому что изображение имело очень большие размеры (даже если размер файла был крошечным).
Таким образом, исправление было просто изменить размер изображения :)
источник
android:hardwareAccelerated="false"
некоторые анимации, такие как макет тени, не работали. Но после изменения размеров все проблемы были решены, спасибо! +1 за эту подсказку!На самом деле вы можете добавить в свой манифест эти строки
android:hardwareAccelerated="false"
,android:largeHeap="true"
это работает для некоторых ситуаций, но помните, что другая часть кода может спорить с этим.источник
Это должно работать
источник
Измените размер изображения перед настройкой ImageView следующим образом:
где размер - это фактический размер ImageView. Вы можете достичь размера путем измерения:
и использовать следующий размер
imageView.getMeasuredWidth()
иimageView.getMeasuredHeight()
дляscaling
.источник
Используйте Glide Library и Override size, чтобы уменьшить размер;
источник
Я получил ниже ошибки
после добавления
android:largeHeap="true"
в AndroidManifest.xml я избавляюсь от всех ошибокисточник
Решение: 1. откройте файл манифеста 2. внутри тега приложения просто добавьте две строки ниже
Пример :
источник
Я решил эту проблему, изменив размер изображения до меньшего размера. Я использую форму ксамарина. уменьшение размера изображения PNG решило проблему.
источник
Я обнаружил, что изображения в папке «drawable» будут преобразованы в намного большее изображение на телефонах с высоким разрешением. Например, изображение с разрешением 200 КБ будет преобразовано в более высокое разрешение, например 800 КБ или 32000 КБ. Я должен был обнаружить это самостоятельно и до настоящего времени не видел документации для этой ловушки кучи памяти. Чтобы предотвратить это, я поместил все в папку drawable-nodpi (в дополнение к использованию «параметров» в BitmapFactory на основе кучи конкретного устройства). Я не могу позволить, чтобы размер моего приложения был увеличен за счет нескольких папок, которые можно рисовать, особенно в связи с тем, что диапазон экранных настроек теперь очень широк. Сложность в том, что студия теперь специально не указывает папку «drawable-nodpi» как таковую в представлении проекта, она просто показывает папку «drawable». Если вы не будете осторожны, то, когда вы добавите изображение в эту папку в студии,
Обязательно нажмите вниз на папку nodpi в диалоговом окне, так как представление проекта не покажет вам все отрисовываемые папки по отдельности, как это было раньше, поэтому сразу не будет видно, что это неправильно. Студия воссоздала ванильный «нарисованный» в какой-то момент для меня после того, как я удалил его давным-давно:
источник
Это сработало для меня: просто переместите изображения из папки drawable в drawable-hdpi.
источник
Soluton попробуйте это в вашем файле манифеста и используйте библиотеку Glide
скомпилируйте 'com.github.bumptech.glide: glide: 3.7.0'
андроид: hardwareAccelerated = "ложь"
андроид: largeHeap = "истина"
Используйте эту библиотеку
Работает счастливое кодирование
источник
добавить это в свой манифест под приложениями? андроид: largeHeap = "истина"
источник
У меня тоже была проблема.
То же самое с большинством других выше. Проблема вызвана огромным изображением.
Просто измените размеры некоторых изображений, и не нужно менять код.
источник
В некоторых случаях (например, операции в цикле) сборщик мусора работает медленнее, чем ваш код. Вы можете использовать вспомогательный метод из этого ответа для ожидания сборщика мусора .
источник
Я новичок в разработке Android, но я надеюсь, что мое решение поможет, оно отлично работает на моем состоянии. Я использую Imageview и установил его фон в «src», потому что я пытаюсь сделать анимацию кадра. Я получил ту же ошибку, но когда я попытался закодировать это, это сработало
источник
Я столкнулся с этой проблемой, когда я не прекращал свою прежнюю деятельность при переходе к новой деятельности. Я исправил это с
finish();
источник
50/100, если использовать 100, то оригинальное разрешение может остановить приложения из-за нехватки памяти.
если 50 или меньше 100, это будет разрешение 50% или меньше 100, так что это предотвратит проблему нехватки памяти
источник
Вы должны изменить размер объекта в Drawable. Это слишком большой для Android для отображения. Например, если вы устанавливаете изображение, попробуйте изображение с меньшим количеством пикселей. Меня устраивает. Спасибо. :)
источник
Ваше приложение дает сбой, потому что размер вашего изображения (в МБ или КБ) слишком велик, поэтому он не выделяет для этого место. Поэтому, прежде чем вставлять ваше изображение в рисованный, просто уменьшите его размер.
ИЛИ
Вы можете добавить подписку в тег приложения на Manifest.xml
После добавления этого приложения не произойдет сбой.
источник
Моя проблема решена после добавления
в файле Build.Gradle
источник
источник
При загрузке изображения попробуйте уменьшить качество изображения, которое является вторым параметром растрового изображения. Это было решением в моем случае. Раньше было 90, потом я попробовал с 60 (как сейчас в коде ниже).
источник
Попробуйте самый простой. Возможно, ваше приложение дает сбой, потому что размер вашего изображения (в МБ) слишком велик, поэтому он не выделяет для этого место. Поэтому, прежде чем вставлять ваше изображение в рисованное, просто уменьшите его размер любым программным обеспечением для просмотра или, если вы берете изображение из галереи во время выполнения, чем перед сохранением его сжимайте растровое изображение. Это сработало для меня. определенно для тебя будет.
источник
Затем в теге Appliaction добавьте largeheapsize = "true
источник
Я полагаю, вы хотите использовать это изображение в качестве значка. Как говорит Android, ваше изображение слишком велико. Вам просто нужно масштабировать изображение, чтобы Android знал, какой размер изображения использовать и когда он соответствует разрешению экрана. Для этого в Android Studio: 1. щелкните правой кнопкой мыши на папке res, 2. выберите Image Asset 3. Выберите значок Type 4. Присвойте значку имя 5. Выберите Image на Asset Type 6. Урежьте ваше изображение Нажмите Next и закончите , В вашем XML или исходном коде просто обратитесь к изображению, которое теперь будет находиться либо в папке макета, либо в папке mipmap в соответствии с выбранным типом ресурса. Ошибка исчезнет.
источник
Я действительно не рекомендую редактировать манифест, как это
Эти параметры вызывают эффект не плавной анимации в вашем приложении. Более того, «liveData» или изменение вашей локальной БД (Sqlite, Room) активируются медленно. Это плохо для пользовательского опыта.
Поэтому я рекомендую изменить размер битмапа
Ниже приведен пример кода
источник
Если android: largeHeap = "true" не работает для вас, то
1:
2:
Не удаляйте android: largeHeap = "true"!
источник
Используйте библиотеку загрузки изображений, такую как Picasso или Glide . Использование этих библиотек предотвратит сбои в будущем.
источник