Галерея Android аварийно завершает работу из-за использования памяти

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

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

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


person Panos    schedule 30.01.2012    source источник


Ответы (2)


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

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

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

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

person Janusz    schedule 30.01.2012
comment
для моего приложения требуется минимальный API 7. Смогу ли я его использовать? Я не использую фрагменты, так как приложение предназначено для мобильных телефонов, а не для планшетов. - person Panos; 30.01.2012
comment
Вы можете использовать библиотеку совместимости, чтобы использовать viewpager. Это делает Viewpager доступным с Android 1.6 и выше. - person Janusz; 30.01.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 пикселей :)

person Warpzit    schedule 30.01.2012
comment
SoftReferences в Android будут очищены в тот момент, когда содержимое не будет жесткими ссылками. Это не вариант. См. code.google.com/p/android/issues/detail?id. =20015 для получения дополнительной информации. - person Janusz; 30.01.2012