Android: java.lang.OutOfMemoryError: Не удалось выделить 23970828 байт с 2097152 свободными байтами и 2 МБ до OOM

355

Я хочу показать растровое изображение в 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)
androidTag
источник
4
проверьте пиксели изображения, ширина не должна превышать 1440, а высота 2560, при этом не будет отображаться OutOfMemoryError
Pankaj Lilan
1
@PankajLilan Где вы нашли эти значения (1440 X 2560)? Любые ссылки из документации Android?
LCJ
См. Также stackoverflow.com/questions/477572/…
JFreeman

Ответы:

525

OutOfMemoryError - это наиболее распространенная проблема, возникающая в Android, особенно при работе с растровыми изображениями. Эта ошибка выдается виртуальной машиной Java (JVM), когда объект не может быть выделен из-за недостатка места в памяти, а также сборщик мусора не может освободить некоторое пространство.

Как отметил Алексей, вы можете добавить нижеприведенные сущности в свой файл манифеста android:hardwareAccelerated="false", android:largeHeap="true"это будет работать для некоторых сред.

<application
    android:allowBackup="true"
    android:hardwareAccelerated="false"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

Вы должны обязательно прочитать некоторые из концепций разработчика 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 /, и это может решить вашу проблему.

Король масс
источник
1
Не могли бы вы опубликовать, как вы в конечном итоге решили проблему? Потому что у меня та же проблема ... На самом деле вы можете добавить в свой манифест строки: спорить с этим ...
Алексей Тимощенко
6
навигация приложения становится очень медленной после добавления этого.
Ума Аханта
10
android: hardwareAccelerated = "false" замораживание вашего приложения
Рахим Рагимов
1
Для тех, у кого все еще были сбои после добавления этой строки, попробуйте вставить свое изображение в папку res / drawable-xhdpi / вместо res / drawable /, и это может решить вашу проблему.
17
6
почему вы предлагаете android: hardwareAccelerated = "false? в чем его польза?"
batmaci
86

Вы пытались добавить это в свой манифест под приложениями? android:largeHeap="true"?

нравится

  <application
      android:name=".ParaseApplication"
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme"
      android:largeHeap="true" >
TSG
источник
17
Я пытался с этим android: largeHeap = "true", но получаю ту же ошибку
androidTag
1
попробуйте сжать свое изображение, прежде чем использовать эту ссылку для этого tinyjpg.com
TSG
1
Вы также можете сжать PNG с этим сайтом
TSG
27

Для меня проблема заключалась в том, что мой файл .png распаковывался, чтобы быть действительно огромным растровым изображением в памяти, потому что изображение имело очень большие размеры (даже если размер файла был крошечным).

Таким образом, исправление было просто изменить размер изображения :)

Петрус-jvrensburg
источник
4
это правильное решение, потому что я сначала попробовал описанные выше решения, но после применения android:hardwareAccelerated="false"некоторые анимации, такие как макет тени, не работали. Но после изменения размеров все проблемы были решены, спасибо! +1 за эту подсказку!
Kaushal28
1
это решило мою проблему. Спасибо @petrus
Hùng Nguyễn
27

На самом деле вы можете добавить в свой манифест эти строки android:hardwareAccelerated="false", android:largeHeap="true"это работает для некоторых ситуаций, но помните, что другая часть кода может спорить с этим.

<application
    android:allowBackup="true"
    android:hardwareAccelerated="false"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
Алексей Тимощенко
источник
2
не работал, он вылетал с той же ошибкой, когда использовал Bitmap.createBitmap
Narendra Singh
@ К сожалению (я также потратил некоторое время, чтобы решить эту проблему, и это работа для меня. Но это только один из способов ... Есть много другого подхода
Алексей Тимощенко
2
Какова цель android: hardwareAccelerated = "false" ?
Игорь Ганапольский
@IgorGanapolsky Из официального документа говорит ... см. Эту ссылку
Шилендра Мадда
27

Это должно работать

 BitmapFactory.Options options = new BitmapFactory.Options();
 options.inSampleSize = 8;

 mBitmapSampled = BitmapFactory.decodeFile(mCurrentPhotoPath,options);
Акшай комарла
источник
11

Измените размер изображения перед настройкой ImageView следующим образом:

Bitmap.createScaledBitmap(_yourImageBitmap, _size, _size, false);

где размер - это фактический размер ImageView. Вы можете достичь размера путем измерения:

imageView.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));

и использовать следующий размер imageView.getMeasuredWidth()и imageView.getMeasuredHeight()для scaling.

Владимир Еремеев
источник
Я пытался с этим android: largeHeap = "true", но получаю ту же ошибку
androidTag
Еще один пример того, почему это не обязательно будет работать (с использованием частного хранилища приложений): размещение растрового изображения в res / drawable / может привести к той же ошибке, но это не будет происходить каждый раз. Размещение того же растрового изображения в res / drawable-xhdpi / больше не будет иметь ошибки. Таким образом, как ответ, это не правильно само по себе.
CmosBattery
8

Используйте Glide Library и Override size, чтобы уменьшить размер;

Glide.with(mContext).load(imgID).asBitmap().override(1080, 600).into(mImageView);
Махди Азадбар
источник
6

Я получил ниже ошибки

"E / art: Throwing OutOfMemoryError" Не удалось выделить 47251468 байт для выделения с 16777120 свободных байтов и 23 МБ до OOM "

после добавления android:largeHeap="true"в AndroidManifest.xml я избавляюсь от всех ошибок

<application
    android:allowBackup="true"
    android:icon="@mipmap/guruji"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:largeHeap="true"
    android:theme="@style/AppTheme">
Саи Гопи Н
источник
5

Проблема: не удалось выделить 37748748 байтов для выделения 16777120 свободных байтов и 17 МБ до OOM

Решение: 1. откройте файл манифеста 2. внутри тега приложения просто добавьте две строки ниже

 android:hardwareAccelerated="false"
 android:largeHeap="true"

Пример :

 <application
        android:allowBackup="true"
        android:hardwareAccelerated="false"
        android:largeHeap="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
Кишоре Редди
источник
4

Я решил эту проблему, изменив размер изображения до меньшего размера. Я использую форму ксамарина. уменьшение размера изображения PNG решило проблему.

maxspan
источник
4

Я обнаружил, что изображения в папке «drawable» будут преобразованы в намного большее изображение на телефонах с высоким разрешением. Например, изображение с разрешением 200 КБ будет преобразовано в более высокое разрешение, например 800 КБ или 32000 КБ. Я должен был обнаружить это самостоятельно и до настоящего времени не видел документации для этой ловушки кучи памяти. Чтобы предотвратить это, я поместил все в папку drawable-nodpi (в дополнение к использованию «параметров» в BitmapFactory на основе кучи конкретного устройства). Я не могу позволить, чтобы размер моего приложения был увеличен за счет нескольких папок, которые можно рисовать, особенно в связи с тем, что диапазон экранных настроек теперь очень широк. Сложность в том, что студия теперь специально не указывает папку «drawable-nodpi» как таковую в представлении проекта, она просто показывает папку «drawable». Если вы не будете осторожны, то, когда вы добавите изображение в эту папку в студии,

Careful here 'backgroundtest' did not actually go to drawable-nodpi and will 
be resampled higher, such as 4x or 16x of the original dimensions for high def screens.

введите описание изображения здесь

Обязательно нажмите вниз на папку nodpi в диалоговом окне, так как представление проекта не покажет вам все отрисовываемые папки по отдельности, как это было раньше, поэтому сразу не будет видно, что это неправильно. Студия воссоздала ванильный «нарисованный» в какой-то момент для меня после того, как я удалил его давным-давно:

введите описание изображения здесь

Androidcoder
источник
3

Это сработало для меня: просто переместите изображения из папки drawable в drawable-hdpi.

Хоссейн Амини
источник
чем это объясняется? почему этот переезд работает?
Харун
Пожалуйста, объясните, почему это работает ...?
X-Black ...
3

Soluton попробуйте это в вашем файле манифеста и используйте библиотеку Glide

скомпилируйте 'com.github.bumptech.glide: glide: 3.7.0'

    **Use Glide Library and Override size to less size;**

 if (!TextUtils.isEmpty(message.getPicture())) {
            Glide.with(mContext).load(message.getPicture())
                    .thumbnail(0.5f)
                    .crossFade()
                    .transform(new CircleTransform(mContext))
                    .diskCacheStrategy(DiskCacheStrategy.ALL)
                    .into(holder.imgProfile);
        } 

андроид: hardwareAccelerated = "ложь"

андроид: largeHeap = "истина"

<application
    android:allowBackup="true"
    android:hardwareAccelerated="false"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

Используйте эту библиотеку

  compile 'com.github.bumptech.glide:glide:3.7.0'   

Работает счастливое кодирование

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;

import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;


public class CircleTransform extends BitmapTransformation {
    public CircleTransform(Context context) {
        super(context);
    }

    @Override
    protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
        return circleCrop(pool, toTransform);
    }

    private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {
        if (source == null) return null;

        int size = Math.min(source.getWidth(), source.getHeight());
        int x = (source.getWidth() - size) / 2;
        int y = (source.getHeight() - size) / 2;

        // TODO this could be acquired from the pool too
        Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);

        Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);
        if (result == null) {
            result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
        }

        Canvas canvas = new Canvas(result);
        Paint paint = new Paint();
        paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
        paint.setAntiAlias(true);
        float r = size / 2f;
        canvas.drawCircle(r, r, r, paint);
        return result;
    }

    @Override
    public String getId() {
        return getClass().getName();
    }
}
Кешав Гера
источник
3

добавить это в свой манифест под приложениями? андроид: largeHeap = "истина"

САУРАБ ОМЕР
источник
Также есть еще одно решение: изменить высоту = высота * .75 и ширину = ширина * .75.
САУРАБ ОМЕР
2

У меня тоже была проблема.

То же самое с большинством других выше. Проблема вызвана огромным изображением.

Просто измените размеры некоторых изображений, и не нужно менять код.

Майк Ян
источник
1

Я новичок в разработке Android, но я надеюсь, что мое решение поможет, оно отлично работает на моем состоянии. Я использую Imageview и установил его фон в «src», потому что я пытаюсь сделать анимацию кадра. Я получил ту же ошибку, но когда я попытался закодировать это, это сработало

int ImageID = this.Resources.GetIdentifier(questionPlay[index].Image.ToLower(), "anim", PackageName);
            imgView.SetImageResource(ImageID);
            AnimationDrawable animation = (AnimationDrawable)imgView.Drawable;
            animation.Start();
            animation.Dispose();
MhoniqueFlores
источник
1

Я столкнулся с этой проблемой, когда я не прекращал свою прежнюю деятельность при переходе к новой деятельности. Я исправил это сfinish();

    Intent goToMain = new Intent(this,MainActivity.class);
    startActivity(goToMain);
    finish();
Джейсон Ху
источник
1
Bitmap image =((BitmapDrawable)imageView1.getDrawable()).getBitmap();

ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();

image.compress(Bitmap.CompressFormat.JPEG,50/100,byteArrayOutputStream);

50/100, если использовать 100, то оригинальное разрешение может остановить приложения из-за нехватки памяти.

если 50 или меньше 100, это будет разрешение 50% или меньше 100, так что это предотвратит проблему нехватки памяти

РАХИНУР РАХМАН
источник
1

Вы должны изменить размер объекта в Drawable. Это слишком большой для Android для отображения. Например, если вы устанавливаете изображение, попробуйте изображение с меньшим количеством пикселей. Меня устраивает. Спасибо. :)

Али Хасан Куреши
источник
1

Ваше приложение дает сбой, потому что размер вашего изображения (в МБ или КБ) слишком велик, поэтому он не выделяет для этого место. Поэтому, прежде чем вставлять ваше изображение в рисованный, просто уменьшите его размер.

ИЛИ

Вы можете добавить подписку в тег приложения на Manifest.xml

 android:hardwareAccelerated="false"
    android:largeHeap="true"
    android:allowBackup="true"

После добавления этого приложения не произойдет сбой.

  • всегда используйте изображения меньшего размера в приложении.
  • Если вы добавляете изображения больших размеров в приложение, вы должны добавить синтаксис выше, но размер приложения увеличится.
rhaldar
источник
1

Моя проблема решена после добавления

 dexOptions {
        incremental true
        javaMaxHeapSize "4g"
        preDexLibraries true
        dexInProcess = true
    }

в файле Build.Gradle

Midhilaj
источник
Это просто делает ваше приложение по-настоящему раздутым при использовании памяти
OneCricketeer
@ cricket_007 Каковы последствия этого, если таковые имеются?
Sreekanth Karumanaghat
1
Last but not the least....

Try Method One:

Simple Add these lines of code in the gradle file

dexOptions {
        incremental true
        javaMaxHeapSize "4g"
     }

Example:

android {
    compileSdkVersion XX
    buildToolsVersion "28.X.X"

    defaultConfig {
        applicationId "com.example.xxxxx"
        minSdkVersion 14
        targetSdkVersion 19
    }

dexOptions {
        incremental true
        javaMaxHeapSize "4g"
     }
}

*******************************************************************

Method Two:

Add these two lines of code in manifest file...

android:hardwareAccelerated="false" 
android:largeHeap="true"

Example:

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:hardwareAccelerated="false"
        android:largeHeap="true"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

It will Work for sure any of these cases.....
Амбилпура Сунил Кумар
источник
0

При загрузке изображения попробуйте уменьшить качество изображения, которое является вторым параметром растрового изображения. Это было решением в моем случае. Раньше было 90, потом я попробовал с 60 (как сейчас в коде ниже).

Bitmap yourSelectedImage = BitmapFactory.decodeStream(imageStream);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
finalBitmap.compress(Bitmap.CompressFormat.JPEG,60,baos);
byte[] b = baos.toByteArray();
Тео Михайла
источник
0

Попробуйте самый простой. Возможно, ваше приложение дает сбой, потому что размер вашего изображения (в МБ) слишком велик, поэтому он не выделяет для этого место. Поэтому, прежде чем вставлять ваше изображение в рисованное, просто уменьшите его размер любым программным обеспечением для просмотра или, если вы берете изображение из галереи во время выполнения, чем перед сохранением его сжимайте растровое изображение. Это сработало для меня. определенно для тебя будет.

neens
источник
0
stream = activity.getContentResolver().openInputStream(uri);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;

bitmap = BitmapFactory.decodeStream(stream, null, options);
int Height = bitmap.getHeight();
int Width = bitmap.getWidth();
enter code here
int newHeight = 1000;
float scaleFactor = ((float) newHeight) / Height;
float newWidth = Width * scaleFactor;

float scaleWidth = scaleFactor;
float scaleHeight = scaleFactor;
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
resizedBitmap= Bitmap.createBitmap(bitmap, 0, 0,Width, Height, matrix, true);
bitmap.recycle();

Затем в теге Appliaction добавьте largeheapsize = "true

сатиш мобап разработчик
источник
0

Я полагаю, вы хотите использовать это изображение в качестве значка. Как говорит Android, ваше изображение слишком велико. Вам просто нужно масштабировать изображение, чтобы Android знал, какой размер изображения использовать и когда он соответствует разрешению экрана. Для этого в Android Studio: 1. щелкните правой кнопкой мыши на папке res, 2. выберите Image Asset 3. Выберите значок Type 4. Присвойте значку имя 5. Выберите Image на Asset Type 6. Урежьте ваше изображение Нажмите Next и закончите , В вашем XML или исходном коде просто обратитесь к изображению, которое теперь будет находиться либо в папке макета, либо в папке mipmap в соответствии с выбранным типом ресурса. Ошибка исчезнет.

Симбараше Мупфурурирва
источник
0

Я действительно не рекомендую редактировать манифест, как это

android: hardwareAccelerated = "false", android: largeHeap = "true"

Эти параметры вызывают эффект не плавной анимации в вашем приложении. Более того, «liveData» или изменение вашей локальной БД (Sqlite, Room) активируются медленно. Это плохо для пользовательского опыта.

Поэтому я рекомендую изменить размер битмапа

Ниже приведен пример кода

fun resizeBitmap(source: Bitmap): Bitmap {
      val maxResolution = 1000    //edit 'maxResolution' to fit your need
      val width = source.width
      val height = source.height
      var newWidth = width
      var newHeight = height
      val rate: Float

            if (width > height) {
                if (maxResolution < width) {
                    rate = maxResolution / width.toFloat()
                    newHeight = (height * rate).toInt()
                    newWidth = maxResolution
                }
            } else {
                if (maxResolution < height) {
                    rate = maxResolution / height.toFloat()
                    newWidth = (width * rate).toInt()
                    newHeight = maxResolution
                }
            }
            return Bitmap.createScaledBitmap(source, newWidth, newHeight, true)
 }
J.Dragon
источник
0

Если android: largeHeap = "true" не работает для вас, то

1:

Сжатие изображений. Я пользуюсь этим сайтом

2:

Преобразование изображений в MDPI, HDPI, XXDPI, XXXDPI, XXXDPI. Я использую этот веб-сайт

Не удаляйте android: largeHeap = "true"!

Шахзад Африди
источник
-1

Используйте библиотеку загрузки изображений, такую ​​как Picasso или Glide . Использование этих библиотек предотвратит сбои в будущем.

Владислав Панченко
источник