Библиотека HTTP, которая делает работу в сети для приложений Android проще и, что самое главное, быстрее.
Прочитав эту статью, вы научитесь вызывать REST API прямо из приложения Android. Мы будем использовать HTTP-библиотеку под названием Volley, которая официально поддерживается Android.
Основываясь на отзывах одного из читателей, Google отказался от этой библиотеки и больше не обновляет ее активно. Последний выпуск - 17 июля 2018 г. Пожалуйста, примите это во внимание, если вы планируете использовать его в своем проекте.
Согласно официальной документации,
«Volley превосходит операции типа RPC, используемые для заполнения пользовательского интерфейса, такие как выборка страницы результатов поиска в виде структурированных данных. Он легко интегрируется с любым протоколом и поставляется прямо из коробки с поддержкой необработанных строк, изображений и JSON. Предоставляя встроенную поддержку необходимых функций, Volley освобождает вас от написания шаблонного кода и позволяет сосредоточиться на логике, характерной для вашего приложения ».
В документации перечислены следующие преимущества:
- Автоматическое планирование сетевых запросов
- Несколько одновременных сетевых подключений
- Прозрачное кэширование ответов диска и памяти со стандартной согласованностью кеш-памяти HTTP
- Поддержка приоритизации запросов
- API запроса отмены. Вы можете отменить один запрос, или вы можете установить блоки или области запросов для отмены
- Легкость настройки, например, для повторной попытки и отката
- Строгий порядок, позволяющий легко правильно заполнить пользовательский интерфейс данными, асинхронно полученными из сети.
- Инструменты отладки и трассировки
Следовательно, Volley - чрезвычайно полезная библиотека для вызова REST API и передачи сетевых данных. Однако Volley не подходит для больших загрузок или потоковых операций, поскольку он сохраняет все ответы в памяти во время синтаксического анализа. Пожалуйста, рассмотрите другие альтернативы, такие как Диспетчер загрузок, если вам нужны потоковые операции.
В этом руководстве есть три раздела:
- Настраивать
- Реализация
- Заключение
1. Настройка
Убедитесь, что у вас установлена Android Studio и необходимый SDK для разработки. Перейдите к build.gradle (Module: app)
и добавьте следующий код внутри зависимостей:
implementation 'com.android.volley:volley:1.1.1'
Синхронизируйте файл gradle и дождитесь его завершения. Добавьте следующее разрешение в AndroidManifest.xml
. Нам понадобится доступ в Интернет для отправки сетевых данных.
<uses-permission android:name="android.permission.INTERNET"/>
Перейдем к следующему разделу, чтобы начать работу над Android-проектом.
2. Реализация
Мы будем настраивать RequestQueue
класс, который будет обслуживать наше приложение. Давайте создадим новый класс с именем RequestSingleton.java
. Настоятельно рекомендуется использовать одноэлементный подход, который намного эффективнее.
Импортировать
Добавьте в класс следующий импорт.
import android.content.Context; import android.graphics.Bitmap; import com.android.volley.DefaultRetryPolicy; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.toolbox.StringRequest; import com.android.volley.toolbox.Volley;
Инициализация
Инициализируйте следующие переменные внутри вашего класса.
private static RequestSingleton instance; private RequestQueue requestQueue; private static Context ctx;
Одноэлементный объект
Создайте синхронизированный метод с именем getInstance
. Мы передаем Context
object в качестве параметра. Мы будем вызывать этот метод, чтобы получить синглтон.
public static synchronized RequestSingleton getInstance(Context context) { if (instance == null) { instance = new RequestSingleton(context); } return instance; }
Конструктор
Создайте конструктор для RequestSingleton
со следующей инициализацией. (Вы увидите ошибку, поскольку функция getRequestQueue
еще не реализована.)
private RequestSingleton(Context context) { ctx = context; requestQueue = getRequestQueue(); }
Реализуйте отсутствующий метод getRequestQueue
с помощью следующего кода.
public RequestQueue getRequestQueue() { if (requestQueue == null) { requestQueue = Volley.newRequestQueue(ctx.getApplicationContext()); } return requestQueue; }
Общий метод запроса
Когда вы закончите, продолжайте добавлять следующую общую функцию, чтобы гарантировать, что наш синглтон сможет поддерживать все виды Request
.
public <T> void addToRequestQueue(Request<T> req) { //retry policy getRequestQueue().add(req); }
Вы можете установить RetryPolicy
, чтобы он не превышал тайм-аут, если для завершения вызова API требуется некоторое время. Добавьте следующее под комментарием, чтобы установить тайм-аут в одну секунду.
req.setRetryPolicy(new DefaultRetryPolicy(
1000,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT))
Он принимает следующие параметры:
Timeout
- указывает время ожидания сокета в миллисекундах на каждую повторную попытку.Number Of Retries
- Количество попыток повтораBack Off Multiplier
- множитель, который используется для определения экспоненциального времени, установленного для сокета для каждой попытки повтора.
StringRequest
Вернитесь к MainActivity.java
и добавьте новую функцию. Он принимает входной параметр String. Давайте попробуем простой GET
вызов с использованием встроенного StringRequest
. Создайте новый объект StringRequest
. Будет два события прослушивателя, в которых вы успешно получите ответ или запрос не прошел. Добавьте объект с помощью метода addToRequestQueue
.
Сделайте вызов ConnectURL
и передайте действительный URL. Вы должны увидеть обратную связь с сервера.
JSONObjectRequest
Если вы собираетесь выполнить POST
запрос с данными JSON, вам нужно будет заранее создать JSONObject
. Добавьте следующий импорт в верхнюю часть вашего проекта.
import org.json.JSONException; import org.json.JSONObject;
Создайте новую функцию и инициализируйте JSONObject
. Вам нужно вызвать функцию put
, чтобы вставить в нее данные. Требуется заключить его в блок try-catch, чтобы зафиксировать JSONException
ошибку. Измените данные соответствующим образом на основе принятого ввода вызова POST
. Вы даже можете передать его через входные параметры функции. Остальная реализация аналогична StringRequest
, за исключением того, что вы передадите переменную jsonObj
при создании JsonObjectRequest
.
Вы можете проверить это, вызвав функцию ConnectURLJson
и передав действительный URL-адрес.
JSONObjectRequest
с изображением
Отправка данных изображения немного сложна и требует преобразования в Base64. Прежде всего, получите соответствующее растровое изображение из вашего ImageView
или любых локальных файлов. Преобразуйте его в байтовые массивы и закодируйте с помощью функции java.util.Base64
. Теперь он в строковом формате, и вы можете легко добавить его в JSONObject
.
Закодированная строка должна быть декодирована на сервере обратно в правильный формат.
3. Заключение
Подведем итоги тому, что мы узнали сегодня. Мы начали с простой настройки, добавив библиотеку в файл gradle. Затем мы добавили необходимое разрешение в Интернет внутри AndroidManifest.xml
.
Затем мы создали новый одноэлементный класс, который предоставляет нам общий метод для добавления всех видов Request
.
В части реализации мы попробовали три разных способа. Первый - это простой вызов GET с использованием StringRequest
. За ним последовал вызов POST, который принимает JSONObject
. Наконец, мы также попытались отправить данные изображения в виде строки Base64.
Спасибо, что прочитали эту статью. Надеюсь увидеть вас снова в следующей статье!