- Использование библиотеки Volley в Android на примере получения данных из погодного API
- Android настроил Volley для использования в кеше
- ОТВЕТЫ
- Ответ 1
- Ответ 2
- Кэширование Android Volley + JSONObjectRequest
- ОТВЕТЫ
- Ответ 1
- Ответ 2
- Ответ 3
- Ответ 4
- Русские Блоги
- Использование Volley в сети Android
- Концепция и преимущества Volley
- Простое использование залпа
- Использование StringRequest
- Использовать шаблон синглтона
- Использование JsonRequest
- Запросить изображение
- Использование ImageRequest
- Использование ImageLoader
- Использование NetworkImageView
- Оптимизировать запрос изображения
- Volley + Gson анализирует сложные данные Json:
Использование библиотеки Volley в Android на примере получения данных из погодного API
Каждому Android-разработчику рано или поздно приходится работать с сетью. В Android есть множество библиотек с открытым исходным кодом, таких как Retrofit, OkHttp или, например, Volley, на которой мы сегодня остановимся подробнее.
Итак, что же эта библиотека из себя представляет?
Volley — это HTTP-библиотека, которая упрощает и ускоряет работу в сети для приложений Android.
Код библиотеки на GitHub .
Итак, для начала работы с Volley нам необходимо добавить её в build.gradle(module:app):
Также необходимо добавить разрешение на использование интернета в манифесте нашего приложения:
Далее нам понадобится API. В данном туториале я воспользуюсь погодным API с сайта openweathermap.org/api .
Для начала создадим простую разметку для отображения данных, взятых из API (Application programming interface).
Далее заходим в MainActivity и создаем необходимые поля:
Инициализируем созданные поля поля в onCreate:
Теперь подходим к основной теме данного туториала — получение данных из API при помощи библиотеки Volley:
1) В MainActivity создаем метод GetWeather:
для приведения json’а в нормальный вид использован jsonformatter
Стоит заметить, что имена объектов должны быть записаны точно так же, как и в нашем API, иначе они просто не ‘достанутся’.
2) Создаем, непосредственно, метод setValues:
3) Вызываем методы getWeather() и setValues() в onCreate():
Источник
Android настроил Volley для использования в кеше
Я пытаюсь создать и использовать кеш для ответа сервера JSON.
кешировать объекты JSON во внутреннюю память и использовать это, когда у нас нет подключения к Интернету.
В следующем примере кода я не могу найти какой-либо документ о том, как кэшировать его с помощью Volley и повторно использовать это, когда заголовок сервера для обновления снова не истекает.
Аналогично: установите истечение в заголовок и используйте кеш и попробуйте загрузить снова после истечения срока действия.
Я пытаюсь установить механизм кэширования для этого метода:
Метод кэширования:
ОТВЕТЫ
Ответ 1
Обратите внимание, что если веб-служба поддерживает вывод кеширования, вам не нужно использовать CacheRequest ниже, потому что Volley будет автоматически кэшировать.
Для вашей проблемы я использую некоторые коды внутри parseCacheHeaders (и ссылаясь на коды @ oleksandr_yefremov). Следующий код, который я тестировал. Конечно, можно использовать и для JsonArrayRequest . Надеюсь эта помощь!
UPDATE
Если вы хотите базовый класс, обратитесь к следующим кодам:
Затем в MainActivity вы можете так называть
ОБНОВЛЕНИЕ С ПОЛНЫМ ИСТОЧНИКОМ КОДА:
Ответ 2
Если ответ берется с сервера с помощью String Request, то просто замените строку
Это работает в моем случае. Попробуйте использовать собственный код.
Источник
Кэширование Android Volley + JSONObjectRequest
Я надеялся, что этого фрагмента кода будет достаточно для того, чтобы я мог получить неявное кэширование ответов. Я не уверен, работает он или нет, потому что я был в предположении, когда отправлен запрос:
он сначала ударил бы по кешу и отправил его на ответ
тогда, когда результаты пройдут с удаленного сервера, он предоставит его onresponse
Я понял, как вручную извлечь кеш и восстановить его в JSONObject и отправить его через функцию OnResponse, но это не кажется эффективным, учитывая, что существует неявное кэширование. Класс JsonObjectRequest должен возвращать JSONObject в качестве кэшированной записи вместо необработанных данных ответа.
Но мне все еще интересно узнать, не ошибаюсь ли я.
Неоднозначность объясняется только отсутствием документации, поэтому я извиняюсь, если у меня что-то совершенно очевидно.
ОТВЕТЫ
Ответ 1
Это означает, что Volley решает, следует ли кэшировать ответ или нет, основываясь только на заголовках «Cache-Control», а затем «Expires», «maxAge».
Что вы можете сделать, это изменить этот метод com.android.volley.toolbox.HttpHeaderParser.parseCacheHeaders(NetworkResponse response) и игнорировать эти заголовки, задайте поля entry.softTtl и entry.ttl для любого значения, которое вам подходит, и используйте свой метод в своем классе запросов. Вот пример:
Используйте этот метод в своем классе Request следующим образом:
Ответ 2
oleksandr_yefremov предоставляет отличные коды, которые могут помочь вам при работе с кеш-стратегией Android Volley, особенно когда REST API имеет неправильные заголовки «Cache-Control» или вам просто нужно больше контролировать собственную стратегию кеша приложений.
Ключ HttpHeaderParser.parseCacheHeaders(NetworkResponse response)) . Если вы хотите иметь собственную стратегию кэширования. Замените его parseIgnoreCacheHeaders(NetworkResponse response) в соответствующем классе.
Если ваш класс расширяет JsonObjectRequest, перейдите в JsonObjectRequest и найдите
и замените HttpHeaderParser.parseCacheHeaders(response) на HttpHeaderParser.parseIgnoreCacheHeaders
Ответ 3
+1 для oleksandr_yefremov и skyfishjy также и предлагает здесь конкретный класс многократного использования, подходящий для json или других API на основе строк:
где функция parseIgnoreCacheHeaders() исходит из ответа oleksandr_yefremov выше. Используйте класс CachingStringRequest везде, где результирующий json может кэшировать в течение 3 минут (вживую) и 24 часа (истек, но все еще доступен). Пример запроса:
и внутри функции обратного вызова onResponse(), проанализируйте json. Задайте любые ограничения кэширования, которые вы хотите — вы можете параметризовать, чтобы добавить пользовательское истечение за запрос.
Для удовольствия попробуйте это в простом приложении, которое загружает json и отображает загруженную информацию. Заполнив кеш первой успешной загрузкой, следите за быстрым рендерингом, когда вы меняете ориентацию, в то время как кеш живет (загрузка не происходит с учетом хита в реальном времени). Теперь убейте приложение, подождите 3 минуты, пока истечет срок его действия (но не 24 часа для его удаления из кеша), включите режим полета и перезапустите приложение. Будет вызван обратный вызов ошибки Volley, и «успешный» ответ на запрос onResponse() будет происходить из кэшированных данных, что позволит вашему приложению как отображать контент, так и знать/предупреждать, что он пришел из истекшего кеша.
Одним из способов такого кэширования было бы устранить загрузчики и другие способы обращения с изменением ориентации. Если запрос проходит через Singleton Volley, и результаты кэшируются, обновления, которые происходят с помощью изменения ориентации, быстро отображаются из кеша автоматически с помощью Volley без Loader.
Конечно, это не соответствует всем требованиям. YMMV
Ответ 4
Я смог заставить Volley кэшировать все ответы, расширяя StringRequest и заменяя запрос, который я хочу принудительно кэшировать с помощью CachingStringRequest .
В переопределенном методе parseNetworkResponse я удаляю заголовки Cache-Control . Таким образом, Volley сохраняет ответ в встроенном кеше.
Источник
Русские Блоги
Использование Volley в сети Android
Концепция и преимущества Volley
Volley — это HTTP-библиотека, которая помогает приложениям Android выполнять сетевые операции более легко, а главное, быстрее и эффективнее. Обычно в Android используются сетевые операции, наиболее знакомыми из которых являются HttpURLConnection и HttpClient (не рекомендуется), но использование этих двух методов все еще немного сложнее, и Volley значительно упрощает сетевые операции, требуя всего несколько строк кода. Может завершить операции, которые может завершить HttpURLConnection.
Его цель разработки очень подходит для сетевых операций с небольшим объемом данных, но частым обменом данными.
Залп не подходит для загрузки больших файлов данных. Потому что залп сохранит все ответы во время анализа. Для загрузки больших объемов данных, пожалуйста, подумайте об использованииDownloadManager。
Залп имеет следующие преимущества:
- Автоматически планировать сетевые запросы.
- Высокое одновременное сетевое соединение.
- Кэшируйте прозрачные ответы на диске и в памяти через стандартную согласованность HTTP-кэша.
- Поддержка, чтобы указать приоритет запроса
- Отзыв API запроса. Мы можем отменить один запрос или указать область в очереди запросов на отмену.
- Фреймворк легко настраивается, например, настраиваемые функции повтора или восстановления.
- Мощное упорядочение (Strong order) может упростить асинхронную загрузку сетевых данных и корректно отображать их в пользовательском интерфейсе
- Содержит средства отладки и трассировки.
Простое использование залпа
Способ использования Volley состоит в создании RequestQueue и последующей передаче ему объекта Request. RequestQueue управляет рабочими потоками, используемыми для выполнения сетевых операций, считывает данные из кэша, записывает данные в кэш и анализирует ответ Http. содержание. Запрашивая для анализа исходных данных ответа, Volley распространит проанализированные данные ответа в основной поток.
Использование StringRequest
Volley предоставляет простой способ: Volley.newRequestQueue используется для создания для вас RequestQueue, использования значения по умолчанию и запуска очереди.
Например:
Кроме того, поскольку Volley хочет получить доступ к сети, не забудьте добавить следующие разрешения в свой файл AndroidManifest.xml:
Таким образом, мы можем получить HTML-код страницы Baidu.
Если мы просто хотим сделать один запрос и не хотим сохранять пул потоков, мы можем отправить простой запрос с помощью метода по умолчанию (Volley.newRequestqueue), создать RequestQueue в любое время и затем Метод stop () выполняется в ответ на обратный вызов для остановки операции.
Но более распространенным подходом является создание RequestQueue и установка его как одиночного. Следующий раздел продемонстрирует этот подход.
Использовать шаблон синглтона
Если нашему приложению необходимо продолжать использовать сеть, более эффективным способом должно быть создание единственного экземпляра RequestQueue, чтобы его можно было поддерживать в течение всего жизненного цикла приложения. Мы можем реализовать этот синглтон разными способами.Рекомендуемый способ — реализовать одноэлементный класс, который инкапсулирует объект RequestQueue и другие функции Volley.Другой метод — расширить класс Application и создать RequestQueue в методе Application.OnCreate (). Но мы не рекомендуем этот метод,Потому что статический синглтон может обеспечить ту же функциональность более модульным способом.
Ключевой концепцией является то, что RequestQueue должен создаваться с использованием контекста приложения, а не контекста Activity.Это гарантирует, что RequestQueue переживет жизненный цикл нашего приложения и не будет воссоздан из-за повторного создания действия (например, когда пользователь поворачивает устройство).
Ниже приведен одноэлементный класс, который предоставляет функции RequestQueue и ImageLoader:
Затем мы можем использовать класс singleton для построения RequestQueue:
Использование JsonRequest
Volley предоставляет следующие классы для запроса данных Json:
JsonArrayRequest-запрос на получение тела ответа массива Json для данного URL.
JsonObjectRequest-запрос на получение тела ответа объекта Json по указанному URL. Разрешить передачу необязательного JSONObject как части тела запроса.
Оба эти класса основаны на общем базовом классе, JsonRequest. Их использование практически идентично StringRequest.
Запросить изображение
Volley предоставляет следующие классы для запроса изображений:
ImageRequest———— Инкапсулированный, используемый для обработки изображения запроса URL и возврата декодированного растрового изображения. Он также предоставляет несколько удобных методов интерфейса, таких как указание размера для повторной резки. Его основное преимущество заключается в том, что Volley обеспечит выполнение трудоемких операций, таких как декодирование и изменение размера, в рабочем потоке.
ImageLoader———— Вспомогательный класс для загрузки и кэширования изображений, полученных из сети. ImageLoader является координатором большого количества ImageRequests. Например, когда в ListView необходимо отобразить большое количество миниатюр. ImageLoader обеспечивает более перспективный кеш памяти для обычного кеша Volley, который очень полезен для предотвращения дрожания изображения. Это также позволяет достигать попаданий в кэш без блокировки или задержки основного потока (это невозможно с дисковым вводом / выводом). ImageLoader также может реализовать объединение ответов, избегая настройки растрового изображения для просмотра почти при каждом ответном обратном вызове. Синдикация ответов позволяет одновременно отправлять несколько ответов, что повышает производительность.
NetworkImageView———— Создан на основе ImageLoader и эффективно заменяет ImageView в случае изображений, полученных через сетевой URL-адрес. Если представление отделено от иерархии, NetworkImageView также может отменить отложенные запросы.
Использование ImageRequest
Ниже приведен пример использования ImageRequest. Он получит картинку, указанную в URL, и отобразит ее в приложении. Обратите внимание, что RequestQueue, продемонстрированный в нем, реализован через одноэлементный класс:
Использование ImageRequest также очень просто: теперь запустите программу и отправьте сетевой запрос, вы увидите, что изображение загружено.
Использование ImageLoader
Мы также можем использовать сам ImageLoader для отображения изображения.
Метод get () получает два параметра: первый параметр — это URL-адрес изображения, а второй параметр — объект ImageListener, инкапсулированный в одноэлементный класс. Первый параметр в методе getImageListener () указывает элемент управления ImageView, используемый для отображения изображения, второй параметр указывает изображение, отображаемое во время загрузки изображения, и третий параметр указывает изображение, отображаемое при сбое загрузки изображения.
Вы также можете получить указанное изображение, запустив программу.
Использование NetworkImageView
Однако, если все, что нам нужно сделать, это установить изображение для ImageView, то мы также можем использовать NetworkImageView для его достижения.
В XML-файле макета мы используем NetworkImageView так же, как ImageView:
Приведенный выше код обращается к RequestQueue и ImageLoader через одноэлементные классы. Такой подход гарантирует, что наше приложение создает синглтоны этих классов, которые будут продолжать существовать в жизненном цикле приложения. Это важно для ImageLoader (вспомогательный класс, используемый для обработки загрузки и кэширования изображений): основная функция кэша памяти — разрешить вращение без дрожания. Использование одноэлементного режима может сделать кэш растрового изображения длиннее, чем активность. Если мы создадим ImageLoader в действии, этот ImageLoader может быть воссоздан при каждом повороте устройства. Это может вызвать дрожание.
Оптимизировать запрос изображения
Панель инструментов Volley предоставляет стандартный кэш, реализованный с помощью класса DiskBasedCache. Этот класс может кэшировать файлы в указанный каталог на диске. Но для того, чтобы использовать ImageLoader, мы должны предоставить пользовательский кэш растрового изображения LRC, который реализует интерфейс ImageLoader.ImageCache. Мы можем захотеть установить кеш как синглтон.
Ниже приведен пример реализации класса памяти LruBitmapCache. Он наследует класс LruCache и реализует интерфейс ImageLoader.ImageCache:
Ниже показано, как создать экземпляр ImageLoader:
Volley + Gson анализирует сложные данные Json:
Я буду использовать плагин Android Studio GsonFormat, который может автоматически генерировать для вас класс Bean, соответствующий данным Json. Это намного быстрее, чем наше собственное создание. Все классы Bean обрабатываются одним щелчком мыши. !
- Нажмите Файл–> Настройки–> Плагины–> и затем найдите GsonFormat, нажмите «Загрузить и установить».
Настройте Javabean (то есть создайте новый файл класса с наилучшим именем и содержимым bean-компонента), а затем нажмите -> code–> Generate–> GsonFormat (или непосредственно нажмите клавишу alt + s [Window]), а затем Скопируйте данные JSON в это поле. Нажмите «Формат», чтобы просмотреть отформатированный эффект (пропустить). Просто нажмите ОК.
Ниже приведен пример ветровой погоды, данные Json, которые он возвращает, выглядят следующим образом:
Поскольку данных слишком много, я не буду их публиковать, но вначале это очень отвратительно. Обратившись к методам других людей, вы можете сделать это:
Данные JSON становятся:
Затем добавьте следующее утверждение:
Тогда данные Json становятся тем, что мы хорошо понимаем:
Тогда вы можете начать анализ! !
Класс Bean автоматически генерируется GsonFormat. Полный код приведен ниже. Я только разбираю здесь название города. Если вам интересно, вы можете анализировать его слой за слоем:
Вставьте результат печати:
Вы можете видеть, что название города было полностью распечатано. Если вам интересно, вы можете анализировать его слой за слоем, поэтому я не буду здесь продолжать.
Источник