2013-07-10 2 views
3

Когда я использую ListView, номер getView() method вызывается много раз. Каждый раз, когда вызывается getView(), я загружаю изображение с помощью задачи Asyc. Я имею в виду каждый раз, когда я возвращаю изображение, которое раздражает.Когда загружать изображение в ListView?

Как понять, когда загрузить изображение?

+0

Вам нужно использовать ленивые загрузки изображений. http://stackoverflow.com/questions/541966/how-do-i-do-a-lazy-load-of-images-in-listview – Knossos

+0

Вы загружаете изображения из сети? Если да, попробуйте ли вы https://developers.google.com/events/io/sessions/325304728, который загрузил/кешировал и т. Д. Для вас? – sandrstar

ответ

0

Вы должны кэшировать загруженные изображения, сохраняя, то есть, на SD-карте, поэтому, как только вы получили копию там, вам не нужно загружать ее снова. Там же много готовых к использованию классов, которые могут сделать работу за вас, как:

http://greendroid.cyrilmottier.com/reference/greendroid/widget/AsyncImageView.html

0

вы должны должны иметь два флага.

Один, который говорит, что если вы уже загрузили изображение, если оно истинно, вы ничего не делаете.

В одной из них говорится, что если вы в настоящее время загружаете изображение, если это правда, вы ничего не делаете.

Члены также помогут вам сохранить состояние изображения.

Ваш код должен выглядеть следующим образом:

private boolean isLoading = false; 
private boolean hasLoaded = false; 

if(!hasLoaded){ 
     if(!isLoading){ 
      isLoading = true; 
      //do async load 
      //on positive completition callback set hasLoaded to true 
      //on negative completition callback set isLoading to false 
     } 
} 
0

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

ниже референтных ссылок поможет вам

http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

http://www.codeproject.com/Articles/35152/WeakReferences-as-a-Good-Caching-Mechanism

+0

Использование слабых ссылок для кэширования в Dalvik - не очень хорошая идея. GC довольно агрессивно собирает их, и ваш кеш не будет очень эффективным. – laalto

0

Volley library (производства Google) имеет очень интуитивный класс для в ImageView, который может иметь URL, называемый "NetworkImageView".

вы должны проверить это и посмотреть видео, так как они показывают, что это очень раздражает, используя asyncTask (плюс, как известно, asyncTask имеет ограничение на количество задач около 255 или около того).

для установки URL-адреса, просто используйте setImageUrl.

у него есть некоторые полезные методы для фаз загрузки тоже: setDefaultImageResId, setErrorImageResId.

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

это устранит необходимость использования asyncTasks для элементов listView.

Один из моих вопросов относительно волейбола содержит пример кода, here.

0

Вы можете добавить слой кеширования и, при необходимости, предварительно загрузить изображения.Хорошая стратегия для кэширования изображений (Bitmap объектов, если быть точным) заключается в использовании стратегии LRU или , которая использовалась в последнее время.

У библиотеки поддержки Android есть класс под названием LruCache, который реализует эту стратегию. Так, например, когда вы загружаете/загружаете изображение в первый раз, вы вставляете его в кеш. позже вы можете сначала проверить, уже ли он в кеше и загрузить его оттуда.

Для предварительной загрузки хорошим правилом является предварительная загрузка предыдущей десяти и следующих десяти позиций.

Смежные вопросы