- Какую библиотеку работы с HTTP в Android выбрать?
- Для чего это вообще?
- Немного истории
- Связывание приложений в Android
- Общие сведения о связывании приложений
- Требования
- Настройка связывания приложений в Android 6.0
- Настройка фильтра намерений
- Создание файла ссылок на цифровые ресурсы
- Тестирование связывания приложений
- Сводка
Какую библиотеку работы с HTTP в Android выбрать?
Представляю вашему вниманию перевод статьи «Which Android HTTP library to use?».
Для чего это вообще?
Немного истории
До Froyo HttpURLConnection имел некоторые не очень приятные баги. В частности, вызов close() у читаемого InputStream мог испортить пул соединений.
… большой размер их API мешает нам улучшать эту библиотеку без потери обратной совместимости. Команда Android не работает активно над Apache HTTP Client.
Apache HTTP client имеет мало багов на Eclair и Froyo, поэтому он является лучшим выбором для этих версий. А для Gingerbread и младше лучше подходит HttpURLConnection. Простота API и небольшой вес хорошо подходят для Android. Прозрачное сжатие и кэширование ответов помогают увеличить скорость и сохранить батарею. Новые приложения должны использовать HttpURLConnection.
Даже сегодня, если вы загляните в исходники Volley от Google (о ней я расскажу чуть попозже), вы сможете найти такое наследие:
Это классический пример фрагментации Android, которая заставляет страдать разработчиков. В 2013 году Square обратила внимание на эту проблему, когда выпускала OkHttp. OkHttp была создана для прямой работы с верхним уровнем сокетов Java, при этом не используя какие-либо дополнительные зависимости. Она поставляется в виде JAR-файла, так что разработчики могут использовать ее на любых устройствах с JVM (куда мы включаем, конечно, и Android). Для упрощения перехода на их библиотеку, Square имплементировали OkHttp используя интерфейсы HttpUrlConnection и Apache client.
OkHttp получила большое распространение и поддержку сообществом, и, в конце-концов, Google решили использовать версию 1.5 в Android 4.4 (KitKat). В июле 2015 Google официально признала AndroidHttpClient, основанный на Apache, устаревшим, вместе с выходом Android 5.1 (Lolipop).
Сегодня OkHttp поставляется со следующим огромным набором функций:
- Поддержка HTTP/2 и SPDY позволяет всем запросам, идущим к одному хосту, делиться сокетом
- Объединение запросов уменьшает время ожидания (если SPDY не доступен)
- Прозрачный GZIP позволяет уменьшить вес загружаемой информации
- Кэширование ответов позволяет избежать работу с сетью при повторных запросах.
- Поддержка как и синхронизированных блокирующих вызовов, так и асинхронных вызовов с обратным вызовом (callback)
Моя самая любимая часть OkHttp – как красиво и аккуратно можно работать с асинхронными запросами:
Это очень удобно, так как работа с сетью не должна быть в UI потоке. По-факту, начиная с Android 3.0 (Honeycomb, API 11), работа с сетью в отдельном потоке стала обязательной. Для того, чтобы воплотить что-то похожее с HtttpUrlConnection, вам потребуется построить большую (а может и монструозную) конструкцию с использованием AsyncTask или отдельного потока. Это будет еще более сложным, если вы захотите добавить отмену загрузки, объединение соединений и т.п.
Кстати, не осталась у обочины и HTTP библиотека от Google под названием Volley, которая предоставляет нам следующие бонусы:
- Автоматическое планирование сетевых запросов
- Множество параллельных сетевых соединений
- Прозрачное кэширование в памяти и на диске, в соответствии со стандартной кэш-согласованностью.
- Поддержка приоритизации запросов.
- Отмена API запросов. Вы можете отменить как один запрос, так и целый блок.
- Простота настройки, например, для повторов и отсрочек.
- Строгая очередность, которая делает легким корректное заполнение данными, полученными асинхронно из сети, интерфейса пользователя.
- Инструменты отладки и трассировки
Все, что ни есть в Volley, находится на вершине HttpUrlConnection. Если вы хотите получить JSON или изображение, то Volley имеет на это специальный абстракции, такие как ImageRequest и JsonObjectRequest, которые помогают вам в автоматическом режиме конвертировать полезную нагрузку HTTP. Так же достойно внимания то, что Volley использует жестко запрограммированный размер сетевого пула:
Когда OkHttp использует поток для каждого вызова с ThreadPoolExecutor с максимальным значением Integer.MAX_VALUE:
В результате, в большинстве случаев OkHttp будет действовать быстрее за счет использования бОльшего количества потоков. Если по каким-то причинам вы захотите использовать OkHttp вместе Volley, то есть реализация HttpStack, которая использует API запросов/ответов из OkHttp заместо HttpURLConnection.
HTTP клиенты продолжили развиваться для поддержки приложений с большим количеством картинок, особенно тех, кто поддерживает бесконечную прокрутку и трансформацию изображений. В то же время, REST API стал стандартом в индустрии, и каждый разработчик имел дело с такими типовыми задачами как сериализация в/из JSON и преобразование REST-вызовов в интерфейсы Java. Не прошло много времени, как появились библиотеки, решающие эти задачи:
- Retrofit – типобезопасный HTTP Android клиент для взаимодействия с REST-интерфейсами
- Picasso – мощная библиотека для загрузки и кэширования изображений под Android
Retrofit предоставляет некий мост между Java кодом и REST-интерфейсом. Он позволяет быстро включить в ваш проект HTTP API интерфейсы, и генерирует самодокументирующуюся реализацию.
В дополнение ко всему, Retrofit поддерживает конвертацию в JSON, XML, протокол буферов (protocol buffers).
Picasso, с другой стороны, предоставляет HTTP библиотеку, ориентированную на работу с изображениями. Например, вы можете загрузить изображение в свой View с помощью одной строчки:
Picasso и Retrofi настроены так, чтобы использовать OkHttpClient как стандартный HTTP клиент. Однако, если хотите, вы можете указать клиентом HttpURLConnection.
Glide – что-то похожее на Picasso. Он предоставляет некоторые дополнительные функции, такие как GIF-анимация, генерация миниатюрных эскизов изображения и неподвижные видео. Полное сравнение можно найти здесь.
Facebook недавно открыли общественности исходный код библиотеки Fresco, которую они используют в своем мобильном приложении. Одна из ключевых функций, которая выделяет ее, — кастомная стратегия выделения памяти для bitmap’ов, чтобы избежать работы долгого GC (сборщик мусора). Fresco выделяет память в регионе, который называется ashmem. Используются некие трюки, чтобы иметь доступ к этому региону памяти доступ как из части, написанной на C++, так и из части на Java. Чтобы уменьшить потребление CPU и данных из сети, эта библиотека использует 3 уровня кэша: 2 в ОЗУ, третий во внутреннем хранилище.
Я нашел необходимым показать отношения между библиотеками на одной схеме. Как вы можете увидеть, HTTP всегда остается внизу у высокоуровневых библиотек. Вы можете выбирать между простым HttpUrlConnection или последним OkHttpClient. Мы используем эту совместимость при разработке PacketZoom Android SDK, о котором мы поговорим в следующем посте.
Недавно мы сравнивали между собой HTTP библиотеки по производительности, но эта тема заслужила отдельного рассмотрения. Мы надеемся, что этот обзор дал вам основные идеи о плюсах и минусах каждой библиотеки, и мы помогли вам сделать правильный выбор. Следите за выходом более интересных постов о сетевой работе в Android от нас.
Источник
Связывание приложений в Android
В этом руководство показано, как в Android 6.0 используется методика связывания приложений, что позволяет мобильным приложениям реагировать на URL-адреса веб-сайтов. Вы узнаете, что такое связывание приложений, как реализовать связывание приложений в приложении Android 6.0 и как настроить на веб-сайте доступ к домену для мобильного приложения.
Общие сведения о связывании приложений
Мобильные приложения больше не находятся в приемнике. во многих случаях они являются важными компонентами их бизнеса, а также их веб-сайтом. Предприятиям нужна возможно легко объединять решения для веб-репрезентации с мобильными приложениями, чтобы ссылки на веб-сайте могли запускать мобильные приложения и отображать в них соответствующее содержимое. Связывание приложений (также называется глубинное связывание) — это один из методов, позволяющих мобильному устройству реагировать на URI и запускать соответствующее мобильное приложение.
Android управляет компоновкой приложений через систему с намерением , когда пользователь щелкает ссылку в браузере мобильного устройства, браузер мобильного устройства будет отправлять намерение, что Android будет делегировать зарегистрированному приложению. Например, щелчок по ссылке на кулинарном веб-сайте открывает мобильное приложение, связанное с этим веб-сайтом, и отображает для пользователя конкретный рецепт. Если для работы с этим намерением зарегистрировано несколько приложений, Android отобразит так называемый диалог устранения неоднозначности, в котором пользователю предлагается выбрать приложение, которое будет обрабатывать это намерение, например так:
Android 6.0 улучшает этот механизм, применяя автоматическую обработку ссылок. Android может автоматически зарегистрировать приложение в качестве обработчика по умолчанию для URI — приложение автоматически запустится и будет переходить к соответствующему действию. Android 6.0 принимает решения об обработке URI по следующим критериям:
- Существующее приложение уже связано с URI — пользователь уже связан с существующим приложением с URI. В этом случае Android продолжит использовать это приложение.
- С универсальным кодом ресурса (URI) не связано существующее приложение, но для него установлено вспомогательное приложение — в этом сценарии пользователь не указал существующее приложение, поэтому Android будет использовать установленное поддерживающее приложение для выполнения запроса.
- С URI не связано ни одно существующее приложение, но установлено множество поддерживаемых приложений , так как существует несколько приложений, поддерживающих универсальный код ресурса (URI), отображается диалоговое окно устранения неоднозначности, и пользователь должен выбрать приложение, которое будет обрабатывать универсальный код ресурса (URI).
Если у пользователя нет установленных приложений, поддерживающих универсальный код ресурса (URI), а затем он установлен, то Android задаст это приложение как обработчик по умолчанию для URI после проверки связи с веб-сайтом, связанным с URI.
В этом руководстве показано, как настроить приложение Android 6.0, а также создать и опубликовать файл ссылок на цифровые ресурсы для поддержки связывания приложений в Android 6.0.
Требования
Для работы с этим руководством требуется Xamarin.Android 6.1 и приложение, предназначенное для использования Android 6.0 (API уровня 23) или выше.
Связывание приложений в более ранних версиях Android реализуется через пакет NuGet Rivets из магазина компонентов для Xamarin. Пакет Rivets не совместим с механизмом связывания приложений в Android 6.0 и не поддерживает этот механизм.
Настройка связывания приложений в Android 6.0
Настройка связывания приложений в Android 6.0 включает два основных этапа.
- Добавление одного или нескольких фильтров с намерением для URI веб-сайта — фильтры намерений Android в разделе как управлять URL-адресом щелкните в браузере мобильного устройства.
- Публикация файла JSON с ссылками на цифровые активы на веб-сайте — это файл, который загружается на веб-сайт и используется Android для проверки связи между мобильным приложением и доменом веб-сайта. Без этого Android не сможет установить приложение в качестве маркера по умолчанию для URI; пользователь должен сделать это вручную.
Настройка фильтра намерений
Вам нужно настроить фильтр намерений, который сопоставляет URI (или даже набор из нескольких URI) некоторого веб-сайта с действием в приложении Android. В Xamarin. Android это отношение устанавливается путем оформления действия с помощью интентфилтераттрибуте. Фильтр намерений должен объявлять следующую информацию:
- Intent.ActionView — Будет зарегистрирован фильтр намерения для реагирования на запросы на просмотр сведений.
- Categories — Фильтр намерения должен зарегистрировать Categories и намерения. категоридефаулт , чтобы иметь возможность правильно обрабатывать URI веб-сайта.
- DataScheme — Фильтр намерения должен объявлять http и (или) https . Существует только две допустимые схемы.
- DataHost — Это домен, из которого берутся URI.
- DataPathPrefix — Это необязательный путь к ресурсам на веб-сайте.
- AutoVerify — autoVerify Атрибут указывает Android проверить связь между приложением и веб-сайтом. Этот механизм мы подробнее обсудим позже.
В следующем примере показано, как использовать интентфилтераттрибуте для управления ссылками из и из http://www.recipe-app.com/recipes :
Android сверит все узлы, которые указаны в фильтрах намерений, с файлом цифровых ресурсов на веб-сайте, прежде чем зарегистрировать приложение в качестве обработчика по умолчанию для этого URI. Все фильтры намерений должны пройти проверку, прежде чем Android применит приложение как обработчик по умолчанию.
Создание файла ссылок на цифровые ресурсы
Для связывания приложений в Android 6.0 требуется, чтобы Android проверял все связи между приложением и веб-сайтом, прежде чем устанавливать приложение в качестве обработчика по умолчанию для URI. Такая проверка выполняется при первой установке приложения. Файл ссылок на цифровые ресурсы имеет формат JSON и размещается на всех соответствующих поддоменах.
android:autoVerify Атрибут должен быть установлен фильтром намерения, иначе Android не будет выполнять проверку.
Этот файл размещается веб-мастером домена по адресу https://domain/.well-known/assetlinks.json .
Файл цифровых ресурсов содержит метаданные, необходимые для проверки связи платформой Android. Файл assetlinks.json содержит следующие пары «ключ — значение»:
- namespace — пространство имен приложения Android.
- package_name — имя пакета приложения Android (объявлено в манифесте приложения).
- sha256_cert_fingerprints — отпечатки SHA256 подписанного приложения. Дополнительные сведения о получении отпечатков SHA1 для приложения см. в статье Отображение MD5 и SHA1 сигнатур хранилища ключей.
Ниже приведен пример файла assetlinks.json, где указано одно приложение:
Вы можете зарегистрировать боле одного отпечатка SHA256, чтобы поддерживать несколько версий или сборок приложения. В следующем файле assetlinks.json представлен пример регистрации нескольких приложений:
Веб-сайт Google по ссылкам на цифровые ресурсы предоставляет онлайн-средство для создания и тестирования файла цифровых ресурсов.
Тестирование связывания приложений
Реализовав связывание приложения, следует проверить разные элементы этого механизма и убедиться, что они работают должным образом.
Вы можете убедиться, что файл цифровых ресурсов имеет правильный формат и правильно размещен, используя API Google для ссылок на цифровые ресурсы, как показано в этом примере:
Существует два теста, которые можно выполнить для проверки правильности фильтров намерений и настройки приложения в качестве обработчика по умолчанию для URI.
Файл цифровых ресурсов правильно размещен, как описано выше. Первый тест отправляет намерение, которое система Android должна передать мобильному приложению. Приложение Android должно открыться и отобразить действие, зарегистрированное для этого URL-адреса. В командной строке введите следующее:
Отобразите существующие политики обработки ссылок для приложений, установленных на конкретном устройстве. Следующая команда выводит список политик для каждого пользователя на устройстве с указанной здесь информацией. В командной строке введите следующую команду:
- Package — Имя пакета приложения.
- Domain — Домены (разделенные пробелами), веб-ссылки которых будут обрабатываться приложением;
- Status — Текущее состояние обработки ссылок для приложения. Значение всегда означает, что приложение объявило и прошло проверку системы. После него указывается шестнадцатеричное число, обозначающее запись приоритета в системе Android.
Сводка
В этом руководстве описана методика связывания приложений в Android 6.0. Затем мы описали, как правильно настроить приложение Android 6.0 для включения поддержки ссылок и реагирования на них. Мы также обсудили, как протестировать связывание приложений для приложения Android.
Источник