Android: ленивая загрузка в Галерее

Я рассмотрел некоторые сообщения о ленивой загрузке, но я полагаю, что моя проблема несколько отличается.

У меня есть галерея (мой класс расширяет Галерею), который отображает 20 довольно больших в изображениях размера (400-500K каждый). Я не могу загрузить их всех в галерею, так как я получаю исключение OutOfMemory.
Так, я создал массив 20 Drawables и первоначально заполнил первые 9 элементов (изображения прибывают из сети), и установите все остальные на пустой указатель. Мое намерение было этим: на броске направо, выберите элемент № 10 и установленный в NULL элемент № 0. На другом броске к правильному элементу выборки № 11 и установленный в NULL элемент № 1 к пустому указателю. Та же логика на оставленном броске.

Проблема, я могу броситься намного быстрее, чем элементы выбираются. Моя галерея имеет BaseAdapter, и его getView () выглядит примерно так:

public View getView(int position, View  convertView, ViewGroup  parent){
     ImageView imageView = new ImageView();
     imageView.setDrawable(imageArray[position];
     ....
     ....

     return imageView;
}

Как я говорю getView () - если imageArray [положение] является все еще пустым, покажите "загрузку..." диалоговое окно и после того как это установлено повторение сами с тем же положением?
Я не хочу видеть imageView пустое и затем набор на лету. Я хочу не смочь видеть imageView вообще, пока он не установлен.

Спасибо.

5
задан Rob 5 July 2010 в 19:24
поделиться

1 ответ

Галерея предназначена для плавного использования. Будет очень плохой пользовательский интерфейс, если вы заблокируете экран и не переключитесь на следующее изображение, пока оно не будет найдено. Таким образом, пользователь вообще не сможет листать. Вы должны отображать какой-нибудь индикатор загрузки вместо изображения во время его загрузки.

Я думаю, что ваш сценарий довольно распространен. Вы должны загружать изображения и отображать их. Если вы получаете OutOfMemory, вы можете попробовать суперсэмплировать изображения Strange out of memory issue while loading an image to a Bitmap object.

Если все еще есть OutOfMemory, вы должны удалить растровые изображения из памяти и кэшировать их на SD. Таким образом, когда пользователь вернется, вы сможете снова загружать изображения с SD, это будет достаточно быстро. И потребление памяти будет меньше. Как вы предлагаете, вы можете иметь 10 последних изображений, кэшированных в памяти, а остальные кэшированные на SD.

Вы можете взглянуть на мой пример кода Lazy load of images in ListView. На самом деле это адаптер ListView, но вы можете применить его к галерее с небольшими изменениями. Я думаю, он сделает именно то, что вам нужно.

6
ответ дан 14 December 2019 в 13:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: