Android Gallery вылетает из-за использования памяти - PullRequest
3 голосов
/ 30 января 2012

В моем приложении мы используем галерею для фотографий, снятых с Android Dev (http://developer.android.com/resources/tutorials/views/hello-gallery.html). Он загружает все фотографии из / sdcard / DCIM (все подкаталоги). Хотя мы сделали это, чтобы повторно использовать показанное изображение, чтобы использовать меньше памяти, он по-прежнему падает, если у пользователя слишком много картинок или прокручивается слишком быстро.

Есть ли какие-либо предложения о том, как сделать так, чтобы галерея не вылетала из приложения ??

(Разве Google не должен был предоставить нам галерею "вне себя", которая позаботится обо всех этих проблемах?)

Ответы [ 2 ]

1 голос
/ 30 января 2012

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

Хорошим решением для этого является использование библиотеки совместимости (доступна с Api Level 4) и Viewpager, которые можно найти там.Это даст вам очень удобную в обслуживании галерею, которая будет намного удобнее (больше не нужно прыгать с изображениями и т. Д.), И если вы используете FragemtSatePagerAdapter фрагменты, которые в данный момент не отображаются в галерее, могут быть уничтожены, еслипамять становится тесной.

Не забудьте правильно реализовать жизненный цикл фрагментов.Это означает:

  • Фрагменту нужен пустой конструктор.
  • Сохраните данные фрагмента в onSaveInstanceState .В вашем случае вы можете сохранить путь к изображению.

Если вы еще не используете фрагменты, использование видового пейджера может показаться большой работой.Но оно того стоит.Впоследствии у вас и вашего пользователя будет намного приятнее приложение.

0 голосов
/ 30 января 2012

Рассматривали ли вы использовать хэш-карту с мягкими ссылками на все изображения и загружать их по запросу, если они недоступны?Нет смысла хранить тонны изображений в памяти, когда они доступны на SD-карте.

private static final ConcurrentHashMap <String, SoftReference<Bitmap>> sBitmapCache =
    new ConcurrentHashMap <String, SoftReference<Bitmap>>();

public static Bitmap getBitmapCache(String imageUrl) {
    SoftReference<Bitmap> reference = sBitmapCache.get(imageUrl);
    Bitmap bitmap = null;
    if(reference != null) {
        bitmap = reference.get();
    } else {
    // get from SD
    }

    return bitmap;
}

О другом редактировании: Вы также можете уменьшить качество изображения, вам не нужно полноекачественное изображение размером 20x20 пикселей:)

...