2010-07-05 8 views
5

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

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

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

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

    return imageView; 
} 

Как сказать GetView() - если imageArray [положение] по-прежнему нулевой, показывают «загрузка ...» диалог и как только он установлен, повторяйте себя с той же позицией?
Я не хочу видеть изображениеView пустым, а затем установить на лету. Я не хочу видеть изображение вообще до тех пор, пока оно не будет установлено.

Спасибо.

+1

В блоге Android есть отличный пост (а также пример кода), который отвечает на ваш вопрос: http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html – Ally

ответ

6

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

Я думаю, что ваш сценарий довольно распространен. Вы должны загружать изображения и отображать их. Если вы получаете 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, но вы можете применить его к галерее с небольшими изменениями. Я думаю, что он будет делать именно то, что вам нужно.

+0

Thanks Fedor , Попробует ... – Rob

+0

«При загрузке должен отображаться некоторый индикатор загрузки вместо изображения». Как это достичь? Я знаю, как поставить индикатор загрузки в ProgressDialog перед галереей, но как я могу поместить индикатор вместо самого изображения? Чтобы напомнить вам, imageView создается во время выполнения. Если бы он был определен в XML, я мог бы назначить ему источник по умолчанию, но здесь это не так ... спасибо. – Rob

+1

Это не проблема. Вы можете создать ProgressControl во время выполнения вместо ImageView. Или вы можете создавать ImageView во время выполнения и отображать некоторое изображение заглушки, пока загружается реальное изображение. Я показываю изображение заглушки в своем примере кода. – Fedor