Я использую ListView
для отображения некоторых изображений и подписей, связанных с этими изображениями. Я получаю изображения из Интернета. Есть ли способ ленивой загрузки изображений, чтобы при отображении текста пользовательский интерфейс не блокировался и изображения отображались по мере загрузки?
Общее количество изображений не является фиксированным.
setUrl
.Ответы:
Вот то, что я создал для хранения изображений, которые мое приложение отображает в данный момент. Обратите внимание, что используемый здесь объект «Log» - это моя специальная оболочка для заключительного класса Log внутри Android.
источник
LRU Cache
developer.android.com/training/displaying-bitmaps/…Я сделал простую демонстрацию ленивого списка (расположенного на GitHub) с изображениями.
Это может быть полезно для кого-то. Загружает изображения в фоновом потоке. Изображения кэшируются на SD-карте и в памяти. Реализация кеша очень проста и ее достаточно для демонстрации. Я декодирую изображения с помощью inSampleSize, чтобы уменьшить потребление памяти. Я также стараюсь правильно обрабатывать переработанные виды.
источник
Я рекомендую инструмент с открытым исходным кодом Universal Image Loader . Первоначально он основан на проекте Федора Власова LazyList и с тех пор значительно улучшился.
источник
Многопоточность для производительности , учебник Жиля Дебунна.
Это из блога разработчиков Android. Предлагаемый код использует:
AsyncTasks
,FIFO cache
.garbage collect
загружаемый кеш.Drawable
в то время как вы загружаете.источник
Обновление: обратите внимание, что этот ответ сейчас довольно неэффективен. Сборщик мусора активно работает с SoftReference и WeakReference, поэтому этот код НЕ подходит для новых приложений. (Вместо этого попробуйте библиотеки, такие как Universal Image Loader, предложенный в других ответах.)
Спасибо Джеймсу за код и Бао-Лонгу за предложение использовать SoftReference. Я реализовал изменения SoftReference в коде Джеймса. К сожалению, из-за SoftReferences мои изображения собирались слишком быстро. В моем случае это было нормально без SoftReference, потому что мой размер списка ограничен, а мои изображения маленькие.
Существует год назад обсуждение SoftReferences в группах Google: ссылка на тему . В качестве решения для слишком ранней сборки мусора они предлагают возможность вручную установить размер кучи виртуальной машины с помощью dalvik.system.VMRuntime.setMinimumHeapSize (), что не очень привлекательно для меня.
источник
Пикассо
Используйте Библиотеку Пикассо Джейка Уортона. (Идеальная библиотека загрузки изображений от разработчика ActionBarSherlock)
Мощная библиотека загрузки и кэширования изображений для Android.
Изображения добавляют столь необходимый контекст и визуальный стиль приложениям Android. Picasso позволяет без проблем загружать изображения в ваше приложение - часто в одну строку кода!
Picasso автоматически обрабатывает многие распространенные ошибки при загрузке изображений на Android:
Обработка утилизации ImageView и отмена загрузки в адаптере. Сложные преобразования изображений с минимальным использованием памяти. Автоматическое кеширование памяти и диска.
Библиотека Пикассо Джейка Уортона
скольжение
Glide - это быстрая и эффективная среда управления мультимедиа с открытым исходным кодом для Android, которая объединяет декодирование мультимедиа, кэширование памяти и диска, а также пул ресурсов в простой и удобный интерфейс.
Glide поддерживает выборку, декодирование и отображение видеоизображений, изображений и анимированных GIF-файлов. Glide включает гибкий API, который позволяет разработчикам подключаться практически к любому сетевому стеку. По умолчанию Glide использует собственный стек на основе HttpUrlConnection, но также включает в себя библиотеки утилит, подключаемые к проекту Volley от Google или к библиотеке OkHttp от Square.
Основная задача Glide - сделать прокрутку любого списка изображений максимально плавной и быстрой, но Glide также эффективен практически в любом случае, когда вам нужно извлечь, изменить размер и отобразить удаленное изображение.
Библиотека загрузки изображений Glide
Фреска от Facebook
Fresco - мощная система отображения изображений в приложениях Android.
Fresco заботится о загрузке и отображении изображений, поэтому вам не нужно этого делать. Он будет загружать изображения из сети, локального хранилища или локальных ресурсов и отображать заполнитель до тех пор, пока изображение не будет получено. Имеет два уровня кеша; один в памяти и другой во внутренней памяти.
Фреска Гитхуб
В Android 4.x и ниже Fresco помещает изображения в специальную область памяти Android. Это позволяет вашему приложению работать быстрее и гораздо реже страдать от страшной ошибки OutOfMemoryError.
Фреска Документация
источник
Высокопроизводительный загрузчик - после изучения методов, предложенных здесь, я использовал решение Бена с некоторыми изменениями -
Я понял, что работа с рисованными объектами быстрее, чем с растровыми изображениями, поэтому вместо этого я использую рисованные
Использование SoftReference - это замечательно, но из-за этого слишком часто удаляется кэшированное изображение, поэтому я добавил Связанный список, содержащий ссылки на изображения, которые не позволяют удалять изображение до тех пор, пока оно не достигнет заранее определенного размера.
Чтобы открыть InputStream, я использовал java.net.URLConnection, который позволяет мне использовать веб-кеш (сначала нужно установить кеш ответов, но это уже другая история)
Мой код:
источник
import java.util.Map; import java.util.HashMap; import java.util.LinkedList; import java.util.Collections; import java.util.WeakHashMap; import java.lang.ref.SoftReference; import java.util.concurrent.Executors; import java.util.concurrent.ExecutorService; import android.graphics.drawable.Drawable; import android.widget.ImageView; import android.os.Handler; import android.os.Message; import java.io.InputStream; import java.net.MalformedURLException; import java.io.IOException; import java.net.URL; import java.net.URLConnection;
Я прошел обучение на Android и считаю, что он отлично справляется с загрузкой изображений без блокировки основного интерфейса. Он также обрабатывает кэширование и имеет дело с прокруткой многих изображений: Эффективная загрузка больших растровых изображений
источник
1. Picasso позволяет без проблем загружать изображения в ваше приложение - часто в одну строку кода!
Используйте Gradle:
Всего одна строка кода!
2. Glide Библиотека загрузки и кэширования изображений для Android, ориентированная на плавную прокрутку.
Используйте Gradle:
// Для простого просмотра:
3. fresco - это мощная система отображения изображений в приложениях Android. Fresco заботится о загрузке и отображении изображений, поэтому вам не нужно этого делать.
Начало работы с фреской
источник
Я написал учебник, который объясняет, как выполнять отложенную загрузку изображений в виде списка. Я подробно расскажу о проблемах утилизации и параллелизма. Я также использую фиксированный пул потоков, чтобы предотвратить появление большого количества потоков.
Ленивая загрузка изображений в Listview Tutorial
источник
Я делаю это, запуская поток, чтобы загрузить изображения в фоновом режиме и передать ему обратный вызов для каждого элемента списка. Когда загрузка изображения завершена, он вызывает функцию обратного вызова, которая обновляет представление для элемента списка.
Однако этот метод работает не очень хорошо, когда вы перерабатываете представления.
источник
Я просто хочу добавить еще один хороший пример, адаптеры XML . Поскольку он используется Google, и я также использую ту же логику, чтобы избежать ошибки OutOfMemory.
В основном этот ImageDownloader является вашим ответом (так как он охватывает большинство ваших требований). Некоторые вы также можете реализовать в этом.
источник
Это общая проблема на Android, которая была решена многими людьми многими способами. На мой взгляд, лучшее решение, которое я видел, - это относительно новая библиотека под названием Picasso . Вот основные моменты:
Jake Wharton
с известностью ActionBarSherlock .ListView
обнаружениеисточник
Я использовал NetworkImageView из новой библиотеки Android Volley
com.android.volley.toolbox.NetworkImageView
, и, похоже, он работает довольно хорошо. По-видимому, это тот же самый вид, который используется в Google Play и других новых приложениях Google. Определенно стоит проверить.Учебное пособие по кэшированию изображений залпа Google I / O 2013
Разработчики Google событий
источник
Ну, время загрузки изображения из Интернета имеет много решений. Вы также можете использовать библиотеку Android-Query . Это даст вам всю необходимую активность. Убедитесь, что вы хотите сделать, и прочитайте вики-страницу библиотеки. И решить ограничение загрузки изображения.
Это мой код:
Это должно решить вашу проблему с отложенной загрузкой.
источник
Я думаю, что эта проблема очень популярна среди разработчиков Android, и существует множество таких библиотек, которые утверждают, что решают эту проблему, но только некоторые из них, кажется, находятся на высоте. AQuery - одна из таких библиотек, но она лучше, чем большинство из них во всех аспектах, и ее стоит попробовать.
источник
Вы должны попробовать этот универсальный загрузчик лучше. Я использую это после того, как сделал много RnD на ленивой загрузке.
Универсальный загрузчик изображений
особенности
Поддержка Android 2.0+
источник
Взгляните на Shutterbug , облегченный порт Applidium SDWebImage (хорошая библиотека на iOS) для Android. Он поддерживает асинхронное кэширование, сохраняет ошибочные URL-адреса, хорошо обрабатывает параллелизм и содержит полезные подклассы.
Запросы на извлечение (и сообщения об ошибках) тоже приветствуются!
источник
DroidParts имеет ImageFetcher, который требует нулевой конфигурации, чтобы начать.
Клон DroidPartsGram для примера:
источник
Просто быстрый совет для тех, кто не уверен, какую библиотеку использовать для ленивых загрузок изображений:
Есть четыре основных способа.
DIY => Не лучшее решение, но для нескольких изображений и если вы хотите обойтись без использования других библиотек
Volley's Lazy Загрузка библиотеки => От парней на андроид. Это хорошо и все, но плохо документировано и, следовательно, является проблемой для использования.
Пикассо: простое решение, которое просто работает, вы даже можете указать точный размер изображения, которое вы хотите ввести. Он очень прост в использовании, но не может быть очень «производительным» для приложений, которые имеют дело с огромным количеством изображений.
UIL: лучший способ ленивой загрузки изображений. Вы можете кэшировать изображения (вам, конечно, нужно разрешение), один раз инициализировать загрузчик, а затем выполнить свою работу. Самая зрелая библиотека асинхронной загрузки изображений, которую я когда-либо видел.
источник
У Novoda также есть отличная библиотека для загрузки ленивых изображений, и многие приложения, такие как Songkick, Podio, SecretDJ и ImageSearch, используют свою библиотеку.
Их библиотека находится здесь, на Github, и у них также есть довольно активный трекер проблем . Их проект, кажется, тоже довольно активен: более 300 коммитов на момент написания этого ответа.
источник
Проверьте мой форк LazyList . По сути, я улучшаю LazyList, задерживая вызов ImageView и создаю два метода:
Я также улучшил ImageLoader, внедрив в этот объект синглтон .
источник
Если вы хотите отобразить макет Shimmer как Facebook, для этого есть официальная библиотека Facebook. FaceBook Shimmer для Android
Это обо всем позаботится, вам просто нужно поместить желаемый код дизайна в виде мерцающей рамки. Вот пример кода.
И вот код Java для этого.
Добавьте эту зависимость в ваш файл Gradle.
Вот как это выглядит.
источник
Весь приведенный выше код имеет свою ценность, но с моим личным опытом просто попробуйте с Пикассо.
Пикассо - это библиотека, специально предназначенная для этой цели, фактически она будет автоматически управлять кэшем и всеми другими сетевыми операциями. Вам нужно будет добавить библиотеку в свой проект и просто написать одну строку кода для загрузки изображения с удаленного URL-адреса.
Пожалуйста, посетите здесь: http://code.tutsplus.com/tutorials/android-sdk-working-with-picasso--cms-22149
источник
Используйте библиотеку скольжения. Это сработало для меня и будет работать для вашего кода. Это работает как для изображений, так и для GIF-файлов.
источник
Я могу порекомендовать другой способ, который работает как шарм: Android Query.
Вы можете скачать этот файл JAR отсюда
Например:
Это очень быстро и точно, и с его помощью вы можете найти много других функций, таких как анимация при загрузке, получение растрового изображения (при необходимости) и т. Д.
источник
Дайте Аквери попробовать. Он имеет удивительно простые методы для асинхронной загрузки и кэширования изображений.
источник
URLImageViewHelper - это удивительная библиотека, которая поможет вам сделать это.
источник
источник
У меня была эта проблема и я реализовал lruCache. Я считаю, что вам нужен API 12 и выше или использовать библиотеку v4 совместимости. lurCache - это быстрая память, но она также имеет бюджет, поэтому, если вы беспокоитесь о том, что вы можете использовать дисковый кэш ... Все это описано в разделе Кэширование растровых изображений .
Теперь я предоставлю свою реализацию, которая является единственной, которую я вызываю из любого места, например:
Вот идеальный код для кеширования и последующего вызова вышеуказанного в getView адаптера при получении веб-изображения:
источник