Сравнение сетевых библиотек Android: OkHTTP, дооснащение и волейбол
Вопрос из двух частей от разработчика iOS, изучающего Android, работающего над проектом Android, который будет выполнять различные запросы от JSON к изображению для потоковой загрузки аудио и видео:
На iOS я широко использовал проект AFNetworking. Есть ли эквивалентная библиотека для Android?
Я читал OkHTTP и Retrofit от Square, а также Volley, но пока не имею опыта их разработки. Я надеюсь, что кто-то может предоставить некоторые конкретные примеры лучших вариантов использования для каждого. Из того, что я прочитал, кажется, что OkHTTP - самый надежный из трех, и он может удовлетворить требования этого проекта (упомянутые выше).
Ответы
Ответ 1
Я надеюсь, что кто-то может предоставить некоторые конкретные примеры наилучших вариантов использования для каждого.
Используйте Retrofit, если вы общаетесь с веб-сервисом. Используйте одноранговую библиотеку Picasso, если вы загружаете изображения. Используйте OkHTTP, если вам нужно выполнить операции HTTP, которые находятся за пределами Retrofit/Picasso.
Залп грубо конкурирует с Retrofit + Picasso. С положительной стороны, это одна библиотека. С другой стороны, это одна недокументированная, неподдерживаемая, "перебросить код через стену и сделать презентацию ввода-вывода на нем".
ОБНОВЛЕНИЕ - Volley теперь официально поддерживается Google. Пожалуйста, ознакомьтесь с Руководством разработчика Google
.
Из того, что я прочитал, кажется, что OkHTTP - самый надежный из 3
Дооснащение использует OkHTTP автоматически, если доступно. Существует Gist от Джейка Уортона, который связывает Volley с OkHTTP.
и может справиться с требованиями этого проекта (упомянутых выше).
Вероятно, вы не будете использовать ни один из них для "потоковой загрузки аудио и видео", по общепринятому определению "потоковая передача". Вместо этого Android Media Framework будет обрабатывать эти HTTP-запросы для вас.
При этом, если вы собираетесь попытаться сделать свою собственную потоковую передачу на основе HTTP, OkHTTP должен обработать этот сценарий; Я не помню, насколько хорошо Волли справился бы с этим сценарием. Ни Retrofit, ни Пикассо не предназначены для этого.
Ответ 2
Глядя на перспективу "Волейбол", некоторые преимущества для вашего требования:
Volley, с одной стороны, полностью сосредоточен на обработке индивидуальных небольших HTTP-запросов. Поэтому, если ваша обработка запросов HTTP имеет некоторые причуды, у Volley, вероятно, есть крючок для вас. Если, с другой стороны, у вас есть причуда в обработке изображений, единственный реальный у вас у вас есть ImageCache. "Это не ничто, но его не много!". но он имеет больше других преимуществ. Как только вы определяете свои запросы, использование их изнутри фрагмента или действия безболезненно, в отличие от параллельных AsyncTasks
Плюсы и минусы Volley:
Так что приятно о Волейле?
-
Сетевая часть предназначена не только для изображений. Волейбол призван стать неотъемлемой частью вашего заднего конца. Для нового проекта, основанного на простой службе REST, это может стать большой победой.
-
NetworkImageView более агрессивен в отношении очистки запросов, чем Picasso, и более консервативен по своим шаблонам использования GC. NetworkImageView опирается исключительно на сильные ссылки на память и очищает все данные запроса, как только будет сделан новый запрос для ImageView, или как только этот ImageView перемещается за кадром.
-
Представление. Это сообщение не оценит это утверждение, но они явно проявили осторожность, чтобы быть разумными в своих шаблонах использования памяти. Volley также прилагает усилия для пакетной обработки обратных вызовов в основной поток для уменьшения переключения контекста.
-
По-видимому, у Volley также есть фьючерсы. Проверьте RequestFuture, если вы заинтересованы.
-
Если вы работаете с сжатыми изображениями высокого разрешения, Volley - единственное решение, которое работает хорошо.
-
Volley можно использовать с Okhttp (новая версия Okhttp поддерживает NIO для лучшей производительности)
-
Волейбол отлично справляется с жизненным циклом деятельности.
Проблемы с волейболом:
Поскольку Volley является новым, мало что еще не поддерживается, но оно исправлено.
-
Запросы многоадресной рассылки (решение: https://github.com/vinaysshenoy/enhanced-volley)
-
код состояния 201 принимается за ошибку, код состояния от 200 до 207 - это удачные ответы. (Исправлено: https://github.com/Vinayrraj/CustomVolley)
Обновление: в последней версии Google залпа, то 2XX коды статуса ошибка является фиксированной теперь благодаря Ficus Киркпатрик!
-
он менее документирован, но многие из людей поддерживают залп в github, java, как документация, можно найти здесь. На веб-сайте разработчика Android вы можете найти руководство по передаче данных сети с помощью Volley. И исходный код volley можно найти в Google Git
-
Для решения/изменения политики перенаправления волейбольной платформы используйте Volley с OkHTTP (CommonsWare, упомянутое выше)
Также вы можете прочитать это сравнение загрузки изображений волейбола с помощью Picasso
Модифицированные:
Это выпущено Square, это очень простой в использовании REST API (обновление: Voila! С поддержкой NIO)
Плюсы дооснащения:
-
По сравнению с Volley, API Retrofit REST API является кратким и обеспечивает отличную документацию API и имеет хорошую поддержку в сообществах! Это очень легко добавить в проекты.
-
Мы можем использовать его с любой библиотекой сериализации, с обработкой ошибок.
Обновление: - В Retrofit 2.0.0-beta2 очень много изменений.
- версия 1.6 Retrofit с OkHttp 2.0 теперь зависит от Okio для поддержки java.io и java.nio, что упрощает доступ, хранение и обработку ваших данных с помощью ByteString и Buffer, чтобы сделать некоторые умные вещи для экономии процессора и памяти. (FYI: Это напоминает мне библиотеку Koush OIN с поддержкой NIO!). Мы можем использовать Retrofit вместе с RxJava для объединения и соединения вызовов REST с помощью rxObservables, чтобы избежать уродливых цепочек обратного вызова (чтобы избежать обратного вызова ада !!).
Недостатки модернизации для версии 1.6:
-
Функциональность обработки ошибок, связанных с памятью, не очень хороша (в старых версиях Retrofit/OkHttp), не уверен, улучшилось ли это с поддержкой Okio с поддержкой Java NIO.
-
Минимальная поддержка потоков может привести к обратному аду, если мы используем это ненадлежащим образом.
(Все выше прошлоы были решены в новой версии Retrofit 2.0 beta)
================================================== ======================
Обновить:
Android Async vs Volley vs Retrofit производительности (миллисекунды, более низкое значение лучше):
(FYI выше Retrofit Benchmarks будет улучшаться с поддержкой Java NIO, потому что новая версия OKhttp зависит от библиотеки NIO Okio)
Во всех трех тестах с различными повторами (в 1 - 25 раз) волейбол был где-то от 50% до 75% быстрее. Дооснащение увеличилось на 50% до 90% быстрее, чем у AsyncTasks, достигнув той же конечной точки столько же раз. В тестовом наборе Dashboard это переведено на загрузку/разбор данных на несколько секунд быстрее. Это огромная разница в реальном мире. Чтобы сделать тесты честными, времена для AsyncTasks/Volley включали парсинг JSON, поскольку Retrofit делает это за вас автоматически.
RetroFit выигрывает в тестовом тестировании!
В конце концов, мы решили пойти с Retrofit для нашего приложения. Мало того, что это смехотворно быстро, но он неплохо укладывается в нашу существующую архитектуру. Мы смогли создать родительский интерфейс обратного вызова, который автоматически выполняет обработку ошибок, кэширование и разбиение на страницы с минимальными усилиями для наших API. Чтобы объединить Retrofit, нам пришлось переименовать наши переменные, чтобы сделать наши модели совместимыми с GSON, написать несколько простых интерфейсов, удалить функции из старого API и изменить наши фрагменты, чтобы не использовать AsyncTasks. Теперь, когда у нас есть несколько фрагментов, полностью преобразованных, это довольно безболезненно. Были некоторые боли и проблемы, которые нам пришлось преодолевать, но в целом все прошло гладко. В начале мы столкнулись с несколькими техническими проблемами/ошибками, но у Square есть фантастическое сообщество Google+, которое помогло нам в этом.
Когда использовать Волейбол?!
Мы можем использовать Volley, когда нам нужно загружать изображения, а также использовать REST API !, система очередности сетевых вызовов необходима для многих запросов n/w одновременно! Кроме того, у Volley улучшенная обработка ошибок, связанных с памятью, чем для дооснащения!
OkHttp можно использовать с Volley, Retrofit использует OkHttp по умолчанию! Он поддерживает SPDY, объединение пулов, кеширование дисков, прозрачное сжатие! Недавно он получил некоторую поддержку java NIO с библиотекой Okio.
Источник, кредит: волейбол - модернизация г-ном Джошем Рюшем
Примечание. О потоковой передаче зависит от того, какой тип потоковой передачи вы хотите использовать как RTSP/RTCP.
Ответ 3
RoboSpice Vs. Волейбол
Из https://groups.google.com/forum/#!topic/robospice/QwVCfY_glOQ
- RoboSpice (RS) является основанной на сервисах и более уважительной философией Android, чем Volley. Volley основан на потоках, и это не так, как фоновая обработка должна происходить на Android. В конечном счете, вы можете выкапывать обе библиотеки и находить, что они очень похожи, но наш способ делать фоновую обработку ориентирован на Android, что позволяет нам, например, сообщать пользователям, что RS действительно делает что-то в фоновом режиме, что было бы трудно для волейбола (на самом деле это совсем не так).
- RoboSpice и волейбол предлагают отличные функции, такие как приоритизация, повторная политика, аннулирование запроса. Но RS предлагает больше: более продвинутое кэширование, и что большой, с управлением кешем, агрегацией запросов, большим количеством функций, таких как замена на ожидающий запрос, работа с истечением кеша, не полагаясь на заголовки серверов и т.д.
- RoboSpice делает больше за пределами пользовательского интерфейса. Тема: volley будет десериализовать ваши POJO в главной теме, что ужасно для меня. С RS ваше приложение будет более отзывчивым.
- В терминах скорости нам определенно нужны метрики. RS получил супер быстрый сейчас, но все же у нас нет фигуры, чтобы поставить здесь. Волейбол должен теоретически быть немного быстрее, но RS теперь массивно параллелен... кто знает?
- RoboSpice предлагает большой диапазон совместимости с расширениями. Вы можете использовать его с okhttp, retrofit, ormlite (beta), jackson, jackson2, gson, xml serializer, google http client, spring android... Довольно много. Volley можно использовать с окном http и использует gson. что он.
- Volley предлагает больше UI-сахара, чем RS. Волейбол предоставляет NetworkImageView, RS обеспечивает адаптер спайкиста. По функциональности это пока не так, но я считаю, что Volley более продвинутый на эту тему.
- В RoboSpice с момента его выпуска было решено более 200 ошибок. Он довольно прочный и широко используется в производстве. Волейбол менее зрелый, но его пользовательская база должна быстро расти (эффект Google).
- RoboSpice доступен на центральном сервере maven. Волейбол трудно найти;)
Ответ 4
AFNetworking для Android:
Fast Android Networking здесь
Fast Android Networking Library поддерживает все типы запросов HTTP/HTTPS, таких как GET, POST, DELETE, HEAD, PUT, PATCH
Fast Android Networking Library поддерживает загрузку любого типа файлов
Fast Android Networking Library поддерживает загрузку любого типа файлов (поддерживает многостраничную загрузку)
Fast Android Networking Library поддерживает отмену запроса
Fast Android Networking Library поддерживает настройку приоритета для любого запроса (LOW, MEDIUM, HIGH, IMMEDIATE)
Быстрая сетевая библиотека Android поддерживает RxJava
Поскольку он использует OkHttp как сетевой уровень, он поддерживает:
Fast Android Networking Library поддерживает поддержку HTTP/2 позволяет всем запросам одного и того же хоста совместно использовать сокет
В Fast Network Networking Library используется пул соединений, который уменьшает время ожидания запроса (если HTTP/2 не доступен)
Прозрачный GZIP сокращает размеры загрузок
Fast Android Networking Library поддерживает кэширование ответов, которое полностью исключает сеть для повторных запросов
Спасибо: библиотека создана мной
Ответ 5
Async HTTP client loopj vs. Volley
Специфика моего проекта - небольшие запросы HTTP REST, каждые 1-5 минут.
Я использую async HTTP client (1.4.1) в течение длительного времени. Производительность лучше, чем использование HTTP-клиента Apache или HTTP-URL. Во всяком случае, новая версия библиотеки не работает для меня: библиотека inter exception cut цепочка обратных вызовов.
Чтение всех ответов мотивировало меня попробовать что-то новое. Я выбрал библиотеку Volley HTTP.
После использования его в течение некоторого времени, даже без тестов, я ясно вижу, что время отклика до 1.5x, 2x Volley.
Может быть, Retrofit лучше, чем асинхронный HTTP-клиент? Мне нужно попробовать.
Но я уверен, что Воллей не для меня.
Ответ 6
Просто добавлю немного к обсуждению из моего опыта работы с Volley:
-
Volley не обрабатывает потоковые загрузки или загрузки в любом смысле. То есть весь объект запроса должен находиться в памяти, и вы не можете использовать OutputStream
для записи тела запроса в базовый сокет, а также не можете использовать InputStream
для чтения тела ответа, поскольку базовый HttpURLConnection
делает, Таким образом, Volley - плохой выбор для загрузки или загрузки больших файлов. Ваши запросы и ответы должны быть небольшими. Это одно из самых больших ограничений волейбола, с которыми я лично столкнулся. Для того, что стоит, у OkHttp есть интерфейсы для работы с потоками.
-
Отсутствие официальной документации раздражает, хотя мне удалось обойти это, читая исходный код, что довольно легко понять. Более назойливым является то, что, насколько я могу судить, волейбол не имеет официальных версий релиза и артефакта Maven или Gradle, и поэтому управление им как зависимость становится скорее головной болью, чем, скажем, любой из библиотек Square выпустил. Вы просто клонируете репо, строите банку, и вы сами. Ищете исправление ошибки? Направьте и надейтесь на это. Вы можете получить и другие вещи; он не будет документирован. На мой взгляд, это фактически означает, что Volley является неподдерживаемой сторонней библиотекой, хотя база кода достаточно активна. Предостережение emptor.
-
Как нить, наличие Content-Type, привязанного к типу класса/запроса (JsonObjectRequest, ImageRequest и т.д.), является довольно неудобным и немного снижает гибкость вызывающего кода, поскольку вы привязаны к Волейбольная иерархия типа запроса. Мне нравится прямолинейность установки Content-Type в виде заголовка, как и любой другой (кстати, не делайте этого с Volley, вы получите два заголовка Content-Type!). Это только мое личное мнение, и это можно обойти.
Это не значит, что у Volley нет полезных функций. Конечно. Легко настраиваемые политики повтора, прозрачное кэширование, API отмены и поддержка планирования запросов и параллельных соединений - отличные возможности. Просто знайте, что он не предназначен для всех случаев использования HTTP (см. Пункт 1 выше) и что есть некоторые головные боли, связанные с включением Volley в производство в вашем приложении (пункт 2).
Ответ 7
Недавно я нашел lib под названием ion, который добавляет немного дополнительной информации в таблицу.
ion имеет встроенную поддержку загрузки изображений, интегрированную с ImageView, JSON (с помощью GSON), файлы и очень удобную поддержку потоков пользовательского интерфейса.
Я использую его в новом проекте, и пока результаты были хорошими. Его использование намного проще, чем Volley или Retrofit.
Ответ 8
Добавление к принятому ответу и то, что сказал LOG_TAG.... для Volley для анализа ваших данных в фоновом потоке вы должны подклассифицировать Request<YourClassName>
, поскольку метод onResponse
вызывается в основном потоке и разбор по основному потоку может привести к задержке пользовательского интерфейса, если ваш ответ большой.
Прочитайте здесь о том, как это сделать.
Ответ 9
Дооснащение 1.9.0 против RoboSpice
Я использую оба в своем приложении.
Robospice работает быстрее, чем Retrofit, когда я разбираю вложенный класс JSON. Потому что Spice Manger сделает все для вас. В "Дооснащении" вам необходимо создать GsonConverter и десериализовать его.
Я создал два фрагмента в одной и той же активности и назвал одно и то же время двумя одинаковыми URL-адресами.
09-23 20:12:32.830 16002-16002/com.urbanpro.seeker E/RETROFIT﹕ RestAdapter Init
09-23 20:12:32.833 16002-16002/com.urbanpro.seeker E/RETROFIT﹕ calling the method
09-23 20:12:32.837 16002-16002/com.urbanpro.seeker E/ROBOSPICE﹕ initialzig spice manager
09-23 20:12:32.860 16002-16002/com.urbanpro.seeker E/ROBOSPICE﹕ Executing the method
09-23 20:12:33.537 16002-16002/com.urbanpro.seeker E/ROBOSPICE﹕ on SUcceess
09-23 20:12:33.553 16002-16002/com.urbanpro.seeker E/ROBOSPICE﹕ gettting the all contents
09-23 20:12:33.601 16002-21819/com.urbanpro.seeker E/RETROFIT﹕ deseriazation starts
09-23 20:12:33.603 16002-21819/com.urbanpro.seeker E/RETROFIT﹕ deseriazation ends
Ответ 10
И еще один вариант:
https://github.com/apptik/jus
- Он модульный, как Volley, но более расширенный и документация улучшается, поддерживая различные стеки и преобразователи HTTP из коробки.
- У него есть модуль для создания сопоставлений интерфейса API-интерфейса сервера, например Retrofit
- Он также поддерживает JavaRx
И многие другие удобные функции, такие как маркеры, трансформаторы и т.д.