- HttpURLConnection: Подключаемся к URL
- Знакомство с классом HttpURLConnection
- URI (Uniform Resource Identifier)
- Координаты
- Номер телефона
- Контакты
- [Android]Start Activity by Custom URL Scheme
- Custom URL Scheme
- 1. Declare host / scheme at your activity (AndroidManifest.xml)
- 2. If you want to pass parameter to Activity, pass by query string
- 3. In your Activity, get your parameter at query string
- Какую библиотеку работы с HTTP в Android выбрать?
- Для чего это вообще?
- Немного истории
- Android с Kotlin — Как использовать HttpUrlConnection
- 3 ответа
- О методе disconnect()
HttpURLConnection: Подключаемся к URL
4-й курс/закрытая зона
Знакомство с классом HttpURLConnection
Для соединения с веб-серверами Android предлагает несколько способов взаимодействия. В новых проектах для современных устройств рекомендуется использовать класс HttpURLConnection, который мы с вами рассмотрим на примерах.
Класс java.net.HttpURLConnection является подклассом java.net.URLConnection и позволяет реализовать работу по отправке и получении данных из сети по протоколу HTTP. Данные могут быть любого типа и длины. Данный класс следует использовать для отправки и получения потоковых данных, размеры которых нельзя заранее определить. Используя данный класс, вам не нужно думать о сокетах и реализовывать собственные способы общения между клиентом и сервером.
Алгоритм использования следующий:
- Получить объект HttpURLConnection через вызов URL.openConnection() и привести результат к HttpURLConnection
- Подготовить необходимый запрос. Основное в запросе — сам сетевой адрес. Также в запросе можно указать различные метаданные: учётные данные, тип контента, куки сессии и т.п.
- Опционально загрузить тело запроса. В этом случае используется метод setDoOutput(true). Передача данных, записанных в поток, возвращается через метод getOutputStream()
- Прочитать ответ. Заголовок ответа обычно включает метаданные, такие как тип и длина контента, даты изменения, куки сессии. Прочитать данные из потока можно через метод getInputStream(). Если у ответа нет тела, то метод возвращает пустой поток.
- Разорвать соединение. После прочтения ответа от сервера HttpURLConnection следует закрыть через вызов метода disconnect(). Тем самым вы освобождаете ресурсы, занимаемые соединением.
Например, для получения страницы по адресу http://developer.alexanderklimov.ru/android/ можно использовать такой код:
По умолчанию HttpURLConnection использует метод GET. Для использования POST вызывайте setDoOutput(true) и посылайте данные через openOutputStream(). Другие HTTP-методы (OPTIONS, HEAD, PUT, DELETE and TRACE) настраиваются через метод setRequestMethod(String).
Для работы через прокси-сервер используйте URL.openConnection(Proxy) при создании соединения.
Каждый экземпляр HttpURLConnection может использоваться только для одной пары запроса/ответа. Операции с соединениями следует проводить в отдельном потоке.
Вы вошли на сайт, как гость.
Необходимо зарегистрироваться, чтобы прочитать статью
Источник
URI (Uniform Resource Identifier)
URI — это специальный идентификатор, по которому можно определить абстрактный или физический ресурс. Самый понятный пример с URI — это обычная веб-страница. Возьмём к примеру страницу http://developer.alexanderklimov.ru/android/catshop/catshop.php. Данный адрес можно разбить на несколько частей:
- Scheme — http
- Scheme-specific part — //developer.alexanderklimov.ru/android/catshop/catshop.php
- Path — /android/catshop/
У протокола http есть и другие параметры, которые рассматривать не будем. Существует также протокол ftp, имеющий свои параметры. Ниже вы увидите другие примеры. Главное здесь — возможность определить нахождение ресурса по представленным данным.
Допустим, мы хотим загрузить видеоматериал в компонент VideoView. Само видео может находиться в ресурсах программы или на SD-карте. С помощью URI мы можем подсказать программе, откуда следует загрузить файл.
Например, если видеофайл playcat.3gp находится в папке /res/raw, то получить адрес для загрузки можно следующим образом:
Если файл хранится на внешней карточке, то код будет следующим (опустим правильное определение имени карточки):
У компонента VideoView есть метод setVideoURI(URI uri), в котором нужно указать объект класса URI:
Посмотрим на другие примеры:
Координаты
Метод uri.getScheme() вернёт geo, а метод uri.getSchemeSpecificPart() — 54.354183,37.34011.
Номер телефона
В данном случае метод uri.getScheme() вернёт tel, а uri.getSchemeSpecificPart() — 1234578.
Контакты
URI также используется при работе с контент-провайдерами, в частности, с контактами.
Источник
[Android]Start Activity by Custom URL Scheme
If you want start activity, you write code like this.
And If you want launch url page, you will pass Uri with Intent.ACTION_VIEW.
If you use many browser in your phone, android will show select browser view for url load.
This select view is not only url also any other duplication action.
How you can see this select view?
Because that applications use same custom scheme (like ‘http://’, ‘xxx://’)
Let’s see example.
This is notification view about user’s action.
(Look like facebook or instagram’s notification view)
If you click item of list, we will move to activity.
Post’s row id is 10 and Activity name is ‘Activity_Post_Detail’.
Then you can write code like this.
Make new intent instance and pass String extra.
But If you use ‘Custom URL’, you can write code like this.
(Look like load url page)
This way don’t need Activity name. (need only url path)
Furthermore you can launch activity at your browser
Custom URL Scheme
1. Declare host / scheme at your activity (AndroidManifest.xml)
In this example, schme is selphone and host is post_detail
(Custom url will selphone://post_detail)
Now If you load ‘selphone://post_detail?…’ url, this activity will launch.
2. If you want to pass parameter to Activity, pass by query string
If you want pass post_id ( id: 10), you can add query string end of url.
“selphone://post_detail?post_id=10”
3. In your Activity, get your parameter at query string
Check intent action, and get query parameter from intent data.
Do it your self custom url activity for your application
If you want to know more detail infomation, check this page Android Intent Fileters
Источник
Какую библиотеку работы с 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 с Kotlin — Как использовать HttpUrlConnection
Я пытаюсь получить данные с URL-адреса внутри AsyncTask , но получаю сообщение об ошибке при создании нового экземпляра HttpUrlConnection .
Что-то вроде этого на Яве
Но я продолжаю получать ошибку, показанную ниже.
Невозможно получить доступ »: он ‘protected / protected and package /’ в ‘HttpURLConnection’ Невозможно создать экземпляр абстрактного класса
Я что-то упускаю? Я попытался создать объект класса, расширяющий HttpUrlConnection , и попытался реализовать метод init , но не смог
3 ответа
Вот упрощенный вопрос и ответ.
Почему это не удается?
Kotlin: Невозможно получить доступ »: он ‘защищен / защищен и упакован /’ в ‘HttpURLConnection’
Это не удается, потому что вы создаете класс, который не предназначен для непосредственного создания. Он предназначен для создания фабрикой, которая находится в методе URL class openConnection() . Это также не прямой перенос примера кода Java в исходном вопросе.
Самый идиоматический способ открыть это соединение в Kotlin и прочитать его содержимое в виде строки:
Эта форма автоматически закроет все после прочтения текста или при возникновении исключения. Если вы хотите сделать индивидуальное чтение:
ПРИМЕЧАНИЕ : функция расширения use() автоматически открывает и закрывает программу чтения и обрабатывает закрытие при ошибках.
О методе disconnect()
В документации для disconnect говорится:
Каждый экземпляр HttpURLConnection используется для выполнения одного запроса, но основное сетевое соединение с HTTP-сервером может прозрачно использоваться другими экземплярами. Вызов методов close () для InputStream или OutputStream HttpURLConnection после запроса может освободить сетевые ресурсы, связанные с этим экземпляром, но не повлияет на какое-либо общее постоянное соединение. Вызов метода disconnect () может закрыть базовый сокет, если в это время постоянное соединение неактивно.
Так что вы решаете, называть вы это или нет. Вот версия кода, вызывающего отключение:
Вы можете адаптировать свой код; Не забывайте пользовательский Runnable thread.
Самый простой способ выполнить запрос get post с использованием HTTPUrlConnection — создать общий вспомогательный класс, который можно вызывать из любого места приложения для вызова методов запроса GET и POST, без написания один и тот же код снова и снова.
Ниже приведен вспомогательный класс object (Singleton), который вы можете использовать для сетевого вызова для запросов GET и POST.
Используя вышеуказанный объектный класс, вы можете выполнять запросы GET и POST, как показано ниже:
Вместо использования потока вы также можете использовать AsyncTask следующим образом:
Вы можете создать asyncTask как внутренний класс Activity или как отдельный независимый класс.
Теперь, чтобы вызвать сетевой вызов через AsyncTask NetworkAsyncCall в вашем onCreate() или любую функцию, из которой вы хотите вызвать api, вы можете написать:
ПРИМЕЧАНИЕ. Указанный URL не будет работать, поэтому вам необходимо заменить его своим.
Для запроса POST вы можете позвонить:
Вы можете проверить полный код на github здесь. Чтобы получить хорошее объяснение, вы можете проверить это ссылка.
Преимущество использования NetworkAsyncCall в качестве отдельного независимого класса заключается в том, что вам не нужно снова писать код AsyncTask, просто вызовите ту же AsyncTask NetworkAsyncCall с новым объектом из разных действий / функций, однако с этим вы должны реализовать интерфейс слушателя, который вам понадобится для обратного вызова на onPostExecute() после получения ответа от API и для возврата ответа на действие, которое вы должны выполнить для обратного вызова с использованием этого интерфейса.
Источник