Операция Android OutOfMemoryError в стеке Back - PullRequest
0 голосов
/ 26 марта 2019

Я работаю над проектом Android, как Instagram. В проекте много изображений, данных и т. Д. Я использовал библиотеку Glide для набора изображений в ImageView. Поэтому, если я последовательно открываю 10 страниц профиля, я получаю сообщение об ошибке «Недостаточно памяти», например:

java.lang.OutOfMemoryError: Failed to allocate a 44236812 byte allocation with 16777216 free bytes and 32MB until OOM

Я пытался установить флаг на намерение:

setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

и попробовал добавить Manifest.xml:

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

и попробовал добавить в Glide функции одну за другой:

.apply(new RequestOptions().format(DecodeFormat.PREFER_RGB_565)

.skipMemoryCache( true )

.diskCacheStrategy( DiskCacheStrategy.NONE ) and DiskCacheStrategy.DATA

Но никто из них не смог исправить мою ошибку.

Также этот снимок экрана - мой вывод Profiler:

Profiler Output

Я тестирую в профилировщике память до 600 мб, после чего приложение сбросит.

Как я могу это исправить? Мне нужна чья-то помощь.

1 Ответ

0 голосов
/ 26 марта 2019

У меня возникли похожие проблемы с моим приложением. Я предлагаю вам снизить качество изображений или изменить их размер.Для уменьшения размера вы можете использовать это:

public Bitmap getResizedBitmap(Bitmap image, int maxSize) {
        int width = image.getWidth();
        int height = image.getHeight();

        float bitmapRatio = (float)width / (float) height;
        if (bitmapRatio > 1) {
            width = maxSize;
            height = (int) (width / bitmapRatio);
        } else {
            height = maxSize;
            width = (int) (height * bitmapRatio);
        }
        return Bitmap.createScaledBitmap(image, width, height, true);
    }

// bitmap = getResizedBitmap (bitmap, 1000);// Максимальный размер изображения - 1000.

Или вы можете сжать ваше изображение:

Bitmap bitmap = null;
try {
     bitmap = BitmapFactory.decodeStream(new FileInputStream(image));
                    } catch (FileNotFoundException e1) {
                        e1.printStackTrace();
                    }
                FileOutputStream fos = new FileOutputStream(dirname + imageName);
                bitmap = getResizedBitmap(bitmap, 1000);
                // quality is 80%
                bitmap.compress(Bitmap.CompressFormat.PNG, 80, fos);
...