Android: ленивая загрузка в галерее - PullRequest
5 голосов
/ 05 июля 2010

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

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

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

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

     return imageView;
}

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

Спасибо.

1 Ответ

6 голосов
/ 06 июля 2010

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

Я думаю, что ваш сценарий довольно распространен.Вы должны загрузить изображения и отобразить их.Если вы получили OutOfMemory, вы можете попробовать суперсэмплировать изображения Странно нехватка памяти при загрузке изображения в растровый объект .

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

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

...