Загрузка извлекаемого из потока файлов, вызывающего ошибку OutOfMemory

Я знаю, что линия

Drawable.createFromStream (fileInputStream, "src");

способен выбросить ошибку OutOfMemory, когда достигнут предел памяти приложения. Тем не менее, я хотел бы думать, что я был очень прилежен, когда дело доходило до эффективности с памятью.

Вот блок, который на самом деле извлекает drawable:

if(file.exists()) {

    //Get image from app files, null if it doesn't exist
    try {
        FileInputStream fis = context.openFileInput(filename);
        drawable = Drawable.createFromStream(fis, "src");
        fis.close();

        if(!saveInCache)
            mInstanceCache.put(urlString, drawable);

        return drawable;
    } catch(Exception e) {
        e.printStackTrace();
    }
}

Я никогда не мог воспроизвести исключение OutOfMemory на моем конце, но я получаю 2-3 отчета в день от пользователей, которые натолкнулись на него. Я бы хотел сделать свой код более эффективным, но у меня нет идей. Я уже делаю следующее:

1) Добавьте небольшие изображения (размер списка) в кэш, который очищается, как только вы покидаете этот список.

2) Всегда очищайте отрисованную и управляемую мусорную корзину ImageView всякий раз, когда изображение либо заменяется новым, либо вызывается onStop() для действия, на котором размещается большое изображение.

Я думал, этого будет достаточно, но я думаю, нет. Одна вещь, о которой я думал, - это переключение на Bitmaps вместо drawables (используя собственный BitmapFactory от Android). Будет ли это даже иметь значение с точки зрения памяти/эффективности?

Любые отзывы приветствуются. Благодаря!

0
nl ja de

2 ответы

Попробуйте создать извлечение из растрового изображения, используя опцию inPurgeable из BitmapFactory.Options. Я помню, что имел ту же проблему, и решил так.

1
добавлено
Попробуй это. Благодаря! Я не смогу сразу увидеть результаты, но надеюсь, что смогу подтвердить это, так что другие могут использовать это через несколько недель, когда я вижу, что больше не получаю OutOfMemoryErrors.
добавлено автор JMRboosties, источник
Bitmap bitmap = BitmapFactory.decodeFile (имя файла, параметры); bitmapDrawable = new BitmapDrawable (context.getResources (), bitmap); Это то, что я сейчас тестирую. Он работает, но поскольку у вас будет как BitmapDrawable, так и Bitmap в памяти, не будет ли это использовать больше памяти? Я не знаю, может быть, нет. Мысли?
добавлено автор JMRboosties, источник
Да, объект options в этом коде, который я опубликовал в комментарии, имеет inPurgeable, установленный в true. Благодаря!
добавлено автор JMRboosties, источник
Если вы потеряете ссылку на свой растровый объект, он не будет потреблять память. Не забудьте активировать опцию inPurgeable!
добавлено автор Sebastian Breit, источник

The image should be big thats why phones that have low ram give OutOfMemory Exception. Try to reduce the size and resolution of the image if you can. Have a look at http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

0
добавлено
Я прочитал этот учебник, но, к сожалению, это не относится ко мне в этом случае. Изображения, которые я загружаю, большие (около 500x500 пикселей или около того, но обычно только около 100kb или меньше. Кроме того, я загружаю изображение с полным разрешением (его большое изображение, которое занимает примерно половину экрана , так что inSampling просто победит цель иметь большой образ. На самом деле этот учебник в основном охватывает превращение больших изображений в большие пальцы эффективно, есть ли что-то еще там, которое отсутствует, которое применимо для загрузки больших изображений в их полном размере?
добавлено автор JMRboosties, источник
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

Android Developers
Android Developers
4 476 участник(ов)

Общаемся на темы, посвященным Android-разработке, SDK, Kotlin, Realm и т.д.

Android Architecture
Android Architecture
2 186 участник(ов)

Русскоязычный чат по архитектуре в андроид приложениях. Подробнее: http://telegra.ph/Android-Architecture-12-24

rus-speaking/android
rus-speaking/android
1 705 участник(ов)

Основной чат по Android разработке (вопрос-ответ). ПРАВИЛА: bit.ly/andr-rules. NEWS: bit.ly/AnrdResId ЧАТЫ: Основной: bit.ly/andr-main IDE, сборка, Git, сервисы: bit.ly/andr-tools Оффтоп: bit.ly/andr-offtop Конференции, события: bit.ly/andr-events Вакансии, найм: bit.ly/andr-job Архитектура: bit.ly/andr-patterns Rx: bit.ly/andr-rx Тестирование: bit.ly/andr-test Kotlin: bit.ly/andr-kotlin Хаmarin: bit.ly/andr-xamarin За мат, спам, агрессию, предложения о работе, оффтоп в этом канале - бан на сутки и более ☢☢☢

Android Dev Подкаст
Android Dev Подкаст
1 325 участник(ов)

Комната для обсуждения Android Dev подкаста apptractor.ru/AndroidDev/ Общее обсуждение Android: https://t.me/android_ru Остальные чаты про Android: http://t.me/devChats Наши новости https://t.me/androiddevpodcast_news

Android Guards
Android Guards
602 участник(ов)

Обсуждение любых вопросов касающихся безопасности Android. - Защита системы и приложений - Уязвимости и эксплойты - Вредоносное ПО - Копание в кишках системы и приложений (RE)

Android JOB
Android JOB
466 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению Android (full-time, part-time, remote и разовые подработки)

AndroidDev :: Разработка. It's Android time now!
AndroidDev :: Разработка. It's Android time now!
458 участник(ов)

It's Android time now! Чат разработчиков Android. Вакансии, резюме и информацию о митапах размещать можно. Публикацию скрытой и явной рекламы ваших каналов и сайтов после получения разрешения от @olegushakov

Aandroid Talks!
Aandroid Talks!
212 участник(ов)

Чат об общих вопросах по ОС Android. Чат для разработки под андроид - pro.android: https://t.me/joinchat/AAAAAEKIFKnmRT9cMebb9w

Android Rus
Android Rus
68 участник(ов)