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

В этом посте мы начнем новый проект и пойдем дальше в Volley, используя встроенные классы JSONObjectRequest и ImageRequest для использования удаленных данных. Мы также будем использовать пользовательский виджет Volley NetworkImageView, чтобы легко (и безопасно) загружать удаленное изображение в наш пользовательский интерфейс.

Клонировать код на github

Развернуть новый проект Android Studio

Как и прежде, я буду использовать Android Studio для этого урока. Разработка Android Studio по-прежнему идет быстрыми темпами, и в настоящее время она довольно стабильна в общем использовании. С момента последнего урока он был обновлен до бета-версии. Если вы еще не сделали этого, я настоятельно рекомендую использовать Android Studio вместо Eclipse.

Хотите узнать больше об Android Studio? Подпишитесь, чтобы узнать подробности моего руководства в формате PDF — Быстрая разработка Android с помощью Android Studio.

  • Откройте Android Studio и выберите Новый проект.
  • Назовите свое новое приложение VolleyApp2 под названием компании example.com (это автоматически установит имя вашего пакета на com.example.VolleyApp2).
  • Выберите «Телефон и планшет» и API 10: Android 2.3.3 (Gingerbread) в качестве минимального пакета SDK. Это автоматически настроит ваше приложение для использования библиотек поддержки Android для поддержки старых устройств.
  • Выберите Пустое действие с фрагментом. Мы будем использовать ListView, встроенный во фрагмент, для просмотра наших удаленных данных.
  • Назовите свою активность ImagesActivity, макет activity_images и макет фрагмента fragment_images.
  • Наконец, нажмите Готово, чтобы создать новый проект.

После создания проекта и обновления Gradle нажмите Build->Run (Ctrl+R), чтобы протестировать новое приложение. Вы должны увидеть обычное сообщение Hello World! на своем устройстве или в эмуляторе.

Добавить зависимость залпа

Как и прежде, мы будем использовать это полезное зеркало Gradle Volley, чтобы легко импортировать библиотеку в наш проект:

Android Studio теперь предупредит, что необходимо синхронизировать конфигурацию Gradle. Это гарантирует, что конфигурация нашего проекта соответствует конфигурации Gradle в Android Studio. Синхронизация также загрузит новую зависимость от Volley, сделав ее классы доступными в нашем приложении.

Добавьте ListView и адаптер к нашему фрагменту

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

Добавить модель данных

При использовании веб-службы вы, вероятно, захотите сохранить локальный кеш загруженных данных для использования в автономном режиме. Для приложений Android это, скорее всего, будет база данных SQLite для сохранения базы данных. Однако в этом руководстве мы просто кэшируем данные — список URL-адресов изображений и их заголовков — в ArrayList простых объектов ImageRecord.

  • Создайте новый класс ImageRecord с полями для URL-адреса изображения и заголовка:
  • Откройте файл ImagesActivity.java в Android Studio. В конце файла вы увидите, что Android Studio создала внутренний класс PlaceholderFragment. Это фрагмент, который отображается в нашей деятельности.
  • Используйте рефакторинг Android Studio Rename, чтобы изменить имя этого класса на ImagesFragment. Для этого наведите курсор на PlaceholderFragment и выберите Refactor-›Rename [Shift+F6]. В появившемся окне выделения измените PlaceholderFragment на ImagesFragment.
  • Создайте новый класс ImageRecordsAdapter, который будет содержать наш список ImageRecords и адаптирует их к пользовательскому интерфейсу фрагмента:

Мы еще не создали макет image_list_item. Android Studio заметит это и предупредит нас о создании ресурса. Сделайте это сейчас, используя следующий простой макет:

Обратите внимание на использование com.android.volley.toolbox.NetworkImageView вместо обычного виджета ImageView. NetworkImageView — это специальный виджет, предоставляемый Volley, который добавляет простой метод setImageUrl. Volley автоматически обрабатывает для нас загрузку удаленных изображений в NetworkImageView, отменяя любые выполняемые запросы, если NetworkImageView прокручивается за пределы экрана.

  • Внутри ImagesFragment добавьте новое поле ImageRecordsAdapter (mAdapter) и инициализируйте его в методе onActivityCreated:
  • Откройте макет фрагмента и удалите заполнитель TextView, заменив его ListView для отображения списка изображений по мере их загрузки:

Запустив приложение, вы должны увидеть пустой экран. Пришло время получить некоторые удаленные данные с помощью Volley и заполнить наш список!

Получить удаленный канал JSON с помощью Volley

Мы будем использовать Volley так же, как и до, чтобы получить фид JSON. Этот фид содержит список изображений и их заголовков в следующем формате:

  • Начните с расширения класса приложения Android и добавления глобального поля RequestQueue (подробнее об этом см. предыдущее руководство):
  • Укажите новый класс VolleyApplication в файле AndroidManifest.xml вашего приложения. Сейчас самое время добавить разрешение INTERNET:
  • Имея доступную глобальную очередь RequestQueue, готовую получать запросы Volley, теперь мы можем добавить новый частный метод fetch в ImagesFragment:
  • Добавьте вызов fetch() в конце onActivityCreated:

Анализ данных

Приведенный выше код отправляет удаленный запрос (асинхронно) через Volley и возвращает ответ, либо успешно проанализированный JSONObject из ответа, либо ошибку (например, 404).

В нашем обработчике onResponse мы перенаправим проанализированный объект JSONObject в новый метод, анализ которого преобразует канал JSON в список записей изображений.

  • Добавьте новый метод parse() в ImagesFragment для циклического просмотра массива изображений в фиде JSON и создайте новый ImageRecord для каждого :
  • Наконец, обновите обработчик onResponse, чтобы он вызывал наш новый метод parse() и обновлял ArrayAdapter:

Нам нужно добавить метод swapImageRecords() в ImageRecordsAdapter. Это просто очищает существующие данные, добавляет все новые записи и уведомляет адаптер о том, что наши данные были изменены:

Прежде чем мы сможем запустить приложение, нам нужно переопределить метод getView ImageRecordAdapter, чтобы указать, как данные должны быть адаптированы к пользовательскому интерфейсу.

  • Переопределите getView и раздуйте макет image_list_item:

Обратите внимание на использование setImageUrl для загрузки изображения непосредственно в NetworkImageView. Это нам предоставляет Volley. Как и в случае с JSONObjectRequest, нам нужно сообщить Volley, какую RequestQueue следует использовать для управления загружаемыми изображениями.

Однако для изображений Volley предоставляет еще один уровень абстракции — класс ImageLoader. Для этого требуется RequestQueue и объект, реализующий интерфейс ImageLoader.ImageCache. ImageCache позволяет нам хранить уже загруженные изображения в памяти, запуская загрузку по сети только в том случае, если кеш ничего не возвращает.

Кэширование

К сожалению, Volley не предоставляет встроенного кеша, поэтому мы должны написать его сами. К счастью, это относительно просто с помощью класса LruCache, предоставляемого Android:

Кэширование на уровне диска

Volley обеспечивает встроенное кэширование на уровне диска, так как кэширует сетевые запросы. Однако это зависит от правильности установки заголовков кэша ответов сервера (например, `Expires`), поскольку именно так Volley определяет, следует ли повторно загружать элемент).

Если заголовки ответа сервера неверны или не установлены, нам необходимо предоставить собственный дисковый кеш. Можно использовать очень тщательную имплементацию [Jake Wharton’s DiskLruCache] (https://github.com/JakeWharton/DiskLruCache).

С помощью простого кэша в памяти давайте создадим ImageLoader для использования адаптером:

Теперь ваше приложение готово к обработке загруженных данных и любых внешних изображений в ленте. NetworkImageView (и ImageLoader) будет автоматически извлекать и отображать изображения.

Запустите ваше приложение, и вам должны быть представлены результаты проанализированного канала:

Использование удаленных JSON API

Таким образом, вы успешно использовали Volley для использования простого JSON API. Несмотря на то, что можно сделать гораздо больше (например, кэширование диска, локальное кэширование полученных данных с помощью SQLite и т. д.), это руководство показало суть того, что необходимо сделать.

Несмотря на долгое время, я надеюсь, что вы нашли это руководство полезным для изучения новой мощной сетевой среды Android. Использование Volley для обработки ваших сетевых запросов избавляет от огромного количества шаблонного кода и тестов пограничного случая, что означает, что вы можете сосредоточиться на разработке ценных функций вашего приложения!

Пожалуйста, Подпишитесь на мою рассылку, чтобы оставаться в курсе и получать подобные уроки прямо в свой почтовый ящик.

Клонировать код на github

В сторону: Дополняя Волей Пикассо

Хотя Volley предоставляет несколько отличных помощников для загрузки, кэширования и отображения изображений из сети, иногда он может быть немного низкоуровневым. Недавно я использовал библиотеку Пикассо Square для обработки загрузки изображений.

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

Пикассо — это тема для отдельного поста, но вы можете узнать больше на http://square.github.io/picasso/.

Первоначально опубликовано на blog.chrisblunt.com.