Что такое модификация Android

Обновлено: 29.01.2023

Нетворкинг – важнейший фактор мобильной разработки. Большинство, если не все мобильные приложения, на том или ином уровне включают сетевые функции. Приложения либо отправляют, либо получают информацию. Изначально разработчики делали нетворкинг на основном потоке. Это делало приложения менее удобными для пользователя, так как экраны «зависали».

Сеть в основном потоке остановилась после выпуска версии Honeycomb. Затем в 2013 году компания Google разработала Volley.

Введение

Вы можете прочитать мою статью о Volley здесь.

Volley предлагал нечто лучшее: он был быстрее, предоставлял лучшую функциональность, более простой синтаксис и т. д. Тем не менее, когда дело дошло до сети, было куда расти.

Square представила Retrofit.

Использование модернизации

Модернизация используется для выполнения следующих задач:

Преимущества модернизации

  • Это очень быстро.
  • Он обеспечивает прямую связь с веб-службой.
  • Он прост в использовании и понимании.
  • Поддерживает отмену запроса.
  • Он поддерживает почтовые запросы и многокомпонентную загрузку.
  • Он поддерживает как синхронные, так и асинхронные сетевые запросы.
  • Поддерживает динамические URL.
  • Поддерживает преобразователи.

Недостатки модернизации

  • Он не поддерживает загрузку изображений. Для этого требуются другие библиотеки, такие как Glide и Picasso .
  • Он не поддерживает установку приоритетов.

Классы, используемые при модернизации

  • Класс модели. Этот класс содержит объекты, которые необходимо получить из файла JSON.
  • Модернизация экземпляра. Этот класс Java используется для отправки запросов к API.
  • Класс интерфейса. Этот класс Java используется для определения конечных точек.

Предпосылки

  • Установите Android Studio.
  • Читатель должен иметь начальный уровень понимания Java и XML.
  • Читатель должен иметь базовые знания о выполнении сетевых запросов, JSON и REST API.

Шаг 1. Создайте новый проект Android Studio

Откройте Android Studio и запустите новый проект Android Studio -> Пустая активность. Назовем проект MarvelRetrofit. Выберите Готово и дождитесь сборки проекта.

Назовите проект

Шаг 2. Добавление модификации в наше приложение

Добавьте следующие зависимости в файл build.gradle уровня приложения.

Примечание. Можно добавлять разные преобразователи в зависимости от того, какой JSON вы хотите использовать. Ниже приведены примеры некоторых преобразователей:

Добавьте доступ в Интернет для вашего приложения.

Шаг 3. Разработка пользовательского интерфейса для нашего приложения

На этом этапе мы создадим макет для нашего приложения. Поскольку это простое приложение, мы будем использовать только ListView для отображения информации API.

Добавьте следующие строки кода в файл ресурсов макета:

Шаг 4. Создание класса модели

Далее мы создадим класс модели, который будет содержать объекты из JSON. В нашем случае мы хотим получить только имена вымышленных персонажей.

В каталоге Java щелкните правой кнопкой мыши и выберите новый-→ класс java-→ класс app/src/main/java–>. Мы назовем класс нашей модели Results.

Добавьте следующие строки кода в Results.java:

Примечание. В аннотации SerializedName всегда должно отображаться точное имя объекта в файле JSON.

Шаг 5. Создание модифицированного экземпляра

Этот класс Java используется для отправки запросов к API. Мы указываем URL-адрес, содержащий необходимые данные, и используем класс Retrofit Builder.

В каталоге Java щелкните правой кнопкой мыши и выберите new-→ java class-→ app/src/main/java-→class. Назовем наш класс RetrofitClient.

Добавьте следующие строки кода в файл RetrofitClient.java:

Шаг 6. Определите конечные точки

Конечные точки обычно определяются внутри класса интерфейса. Конечная точка относится к пути получения информации. Наша конечная точка — «чудо». Поскольку нашей целью является получение информации из API, мы будем использовать аннотацию @GET, так как делаем запрос Get.

Далее у нас будет объект вызова, который будет возвращать информацию из API.

В каталоге Java щелкните правой кнопкой мыши и выберите новый–> класс java–> приложение/src/main/java–>класс. Мы назовем наш интерфейсный класс Api.

Добавьте следующие строки кода в Api.java:

Шаг 7. Отправка запроса GET

На этом шаге мы будем вызывать каждую из конечных точек API, определенных в нашем классе интерфейса. Класс интерфейса позволит отображать информацию из API в нашем ListView .

Наконец, у нас будет метод onFailure, который будет отображать всплывающее сообщение, если информация не будет успешно загружена в ListView.

Добавьте следующие строки кода в файл MainActivity.java

Давайте запустим наше приложение.

Retrofit

Подведение итогов

Мы узнали, что сетевое взаимодействие является решающим фактором в разработке мобильных приложений. Мы узнали, как использовать Retrofit, его преимущества и недостатки. Знаете ли вы, что Retrofit занимает 312 мс, чтобы провести одно обсуждение? Это очень быстро.

Ознакомьтесь с другими способами использования Retrofit в их официальной документации. Вы можете получить доступ к коду этого руководства на GitHub. Вы также можете скачать образец APK на Google Диске.

Эта библиотека упрощает загрузку данных JSON или XML из веб-API. После того как данные загружены, они преобразуются в простой старый объект Java (POJO), который должен быть определен для каждого «ресурса» в ответе.

Настройка

Убедитесь, что в файле AndroidManifest.xml требуются разрешения на доступ к Интернету:

Добавьте в файл app/build.gradle следующее:

Если вы собираетесь использовать RxJava с Retrofit 2, вам также потребуется включить адаптер RxJava:

Ранее компания Retrofit полагалась на библиотеку Gson для сериализации и десериализации данных JSON. Retrofit 2 теперь поддерживает множество различных синтаксических анализаторов для обработки данных сетевых ответов, включая Moshi, библиотеку, созданную Square для эффективного анализа JSON. Однако есть несколько ограничений, поэтому, если вы не уверены, какой из них выбрать, пока используйте конвертер Gson.

Создание классов Java для ресурсов

В этом руководстве рассматриваются два подхода. Первый способ — это ручной подход, который требует от вас изучения того, как использовать библиотеку Gson. Второй подход заключается в том, что вы также можете автоматически генерировать нужные вам классы Java, захватывая выходные данные JSON и используя jsonschema2pojo. Мы рекомендуем вам следовать ручному способу, чтобы лучше понять, как работает метод автоматического создания кода.

Ручной подход — создание классов Java вручную

Дополнительную информацию о том, как создавать собственные классы Java для использования с Retrofit, см. в этом руководстве по использованию библиотеки Gson. В руководстве показано, как использовать Gson для получения данных из API Rotten Tomatoes, но его можно использовать таким же образом для любой веб-службы RESTful.

Автоматизированный подход — автоматическое создание классов Java

Если у вас уже есть ответ JSON, перейдите на страницу jsonschema2pojo. Обязательно выберите JSON в качестве типа источника:


Установите для стиля аннотации значение Gson .


Затем вставьте вывод JSON в текстовое поле:

Генератор POJO

Нажмите кнопку Предварительный просмотр. Вы должны увидеть, что верхняя часть выглядит примерно так:


Вставьте сгенерированный класс в свой проект в подпакете моделей. Переименуйте имя класса Example, чтобы оно отражало имя вашей модели. В этом примере мы назовем этот файл и классифицируем модель пользователя.

Примечание. Android по умолчанию не поставляется со многими библиотеками javax.annotation. Если вы хотите сохранить аннотацию @Generated, вам нужно будет добавить эту зависимость. См. это обсуждение переполнения стека для получения дополнительной информации. В противном случае вы можете удалить эту аннотацию и использовать остальной сгенерированный код.

Создание экземпляра Retrofit

Чтобы отправлять сетевые запросы к API, нам нужно использовать класс построителя Retrofit и указать базовый URL-адрес для службы.

Обратите также внимание, что нам нужно указать фабрику для десериализации ответа с помощью библиотеки Gson. Порядок, в котором добавляются преобразователи, будет соответствовать последовательности, в которой они будут пытаться обрабатываться, как описано в этом видео-докладе. Если мы хотим передать пользовательский экземпляр парсера Gson, его тоже можно указать:

Определить конечные точки

В Retrofit 2 конечные точки определяются внутри интерфейса с использованием специальных аннотаций модификации для кодирования сведений о параметрах и методе запроса. Кроме того, возвращаемое значение всегда является параметризованным объектом Call, например Call . Если вам не нужен ответ определенного типа, вы можете указать возвращаемое значение как просто Call .

Например, интерфейс определяет каждую конечную точку следующим образом:

Аннотация Описание
@Path переменная замена конечной точки API (т.е. имя пользователя будет заменено на конечную точку URL).
@Query указывает имя ключа запроса с значение аннотируемого параметра.
@Body полезная нагрузка для вызова POST (сериализованная из объекта Java в строку JSON)
@Header указывает заголовок со значением аннотированного параметра

Изменение базового URL

Обычно базовый URL-адрес определяется при создании экземпляра Retrofit. Модернизация 2 позволяет переопределить базовый URL-адрес, указанный в аннотации (например, если вам нужно сохранить одну конкретную конечную точку, используя старую конечную точку API)

Есть и другие, которые позволяют изменять базовый URL-адрес, используя относительные пути (а не полный URL-адрес), как описано в этой статье блога.

Добавление заголовков

Обратите внимание, что есть аннотации @Headers и @Header. Заголовки можно использовать для предоставления предопределенных:

Мы также можем добавить заголовки в качестве параметра конечной точки:

Данные формы

Если мы хотим отправить данные, закодированные в форме, мы можем использовать аннотацию FormUrlEncoded. Аннотация @Field будет обозначать, какие полезные данные будут отправлены в виде данных формы.

Составные формы

Если нам нужно загрузить изображения или файлы, нам нужно отправить их с помощью составных форм. Мы пометим конечную точку с помощью @Multipart и пометим хотя бы один параметр с помощью @Part.

Предполагая, что у нас есть ссылка на файл, мы можем создать объект RequestBody:

Кодировка URL формы

Если мы хотим отправить пары имя/значение в формате POST, мы можем использовать аннотации @FormUrlEncoded и @FieldMap:

Отправка данных JSON

Модернизация 2 будет использовать библиотеку преобразователя, выбранную для обработки десериализации данных из объекта Java. Если вы аннотируете параметр параметром @Body, эта работа будет выполнена автоматически. Например, если вы используете библиотеку Gson, любое поле, принадлежащее классу, будет сериализовано для вас. Вы можете изменить это имя с помощью декоратора @SerializedName:

Наша конечная точка будет выглядеть следующим образом:

Мы могли бы вызвать этот вызов API следующим образом:

Результирующий сетевой вызов будет отправлять эти данные:

Обновление версии 1

Если вы пытаетесь выполнить обновление с версии Retrofit 1, возможно, вы помните, что последний параметр должен был иметь тип обратного вызова, если вы хотите определить, чтобы вызов API выполнялся асинхронно, а не синхронно:

Модернизация 1 использовала этот тип обратного вызова в качестве последнего параметра, чтобы определить, будет ли вызов API отправлен асинхронно, а не синхронно. Чтобы избежать двух разных шаблонов вызова, этот интерфейс был объединен в Retrofit 2. Теперь вы просто определяете возвращаемое значение с помощью параметризованного Call , как показано в предыдущем разделе.

Доступ к API

Мы можем объединить все это, создав службу, использующую интерфейс MyApiEndpointInterface с определенными конечными точками:

Если мы хотим использовать API асинхронно, мы вызываем службу следующим образом:

Как показано выше, Retrofit загрузит и проанализирует данные API в фоновом потоке, а затем передаст результаты обратно в поток пользовательского интерфейса с помощью метода onResponse или onFailure.

Если вы используете Retrofit в фоновой службе вместо действия или фрагмента, вы можете запустить сетевой вызов синхронно в том же потоке, используя метод execute().

RxJava

Retrofit 2 также поддерживает расширения RxJava. Вам нужно будет создать адаптер RxJava. По умолчанию все сетевые вызовы синхронны:

Если вы хотите, чтобы сетевые вызовы по умолчанию были асинхронными, вам нужно использовать createWithScheduler() .

Затем можно создать экземпляр Retrofit:

Вместо создания объектов Call мы будем использовать типы Observable.

В соответствии с инфраструктурой RxJava нам необходимо создать подписчика для обработки ответа. Необходимо добавить методы onCompleted(), onError() и onNext(). Используя библиотеку Android RxJava, мы также можем указать, что мы будем обрабатывать это событие в основном потоке пользовательского интерфейса. Примечание. Если вы намерены переопределить поведение сетевых вызовов по умолчанию, вы можете указать subscribeOn() . В противном случае его можно опустить. Примечание. Поскольку RxJava переписала свой API, используемый здесь термин «Подписка» должен быть заменен на «Одноразовый». Поскольку слово «Подписка» имело конфликтные намерения.

Обратите внимание: если вы выполняете какие-либо вызовы API в действии или фрагменте, вам нужно будет отказаться от подписки на метод onDestroy(). Причины объясняются в этой статье Wiki:

Обратите внимание, что подписка наблюдателя на наблюдаемый объект инициирует сетевой запрос. Дополнительные сведения о том, как подключить несколько наблюдателей перед отправкой сетевых запросов, см. в этом разделе.

Модернизация и аутентификация

Использование заголовков аутентификации

Заголовки можно добавлять к запросу с помощью Interceptor . Чтобы отправлять запросы к аутентифицированному API, добавьте к своим запросам заголовки с помощью перехватчика, как описано ниже:

Использование OAuth

Чтобы пройти аутентификацию с помощью OAuth, нам необходимо подписывать каждый отправляемый сетевой запрос специальным заголовком, который включает токен доступа для пользователя, полученный в процессе OAuth. Фактический процесс OAuth должен быть завершен сторонней библиотекой, такой как указатель, а затем необходимо добавить токен доступа в заголовок с помощью перехватчика запросов. Соответствующие ссылки для модернизации и проверки подлинности ниже:

Ресурсы по использованию указателя для аутентификации с помощью API OAuth:

Вместо указателя можно изучить несколько других библиотек Android OAuth:

Проблемы

Существует известная проблема, связанная с тем, что Retrofit 2 проходит тесты Lint, отслеживаемые в этом тикете. В частности, вы можете увидеть ссылку на пакет в библиотеке; не входит в состав Android: java.nio.file. Ссылка на okio.Okio. или Недопустимая ссылка на пакет в библиотеке; не входит в состав Android: java.lang.invoke. Ссылка из retrofit.Platform.Java8. .

Чтобы обойти эту проблему, создайте файл gradle/lint.xml в корневом проекте:

Добавьте эту строку в файл app/build.gradle:

Ошибки lint должны быть подавлены и пока не вызывают никаких дополнительных ошибок.

Устранение неполадок

Стето

Проект Facebook Stetho позволяет использовать инструменты отладки Chrome для устранения неполадок в сетевом трафике, файлах баз данных и макетах просмотра. Дополнительные сведения см. в этом руководстве.

Retrofit — это REST-клиент для Java и Android, позволяющий извлекать и загружать JSON (или другие структурированные данные) через REST-интерфейс. Вы можете настроить, какие преобразователи используются для сериализации данных, например GSON для JSON.

1.2. Использование модернизации

Для работы с Retrofit вам в основном нужны следующие три класса:

Класс модели, который используется в качестве модели JSON

Для корректировки URL-адреса можно использовать блоки замены и параметры запроса. Блок замены добавляется к относительному URL-адресу с помощью <> . С помощью аннотации @Path к параметру метода значение этого параметра привязывается к конкретному замещающему блоку.

Параметры запроса добавляются с помощью аннотации @Query к параметру метода. Они автоматически добавляются в конце URL-адреса.

Аннотация @Body к параметру метода указывает Retrofit использовать объект в качестве тела запроса для вызова.

2. Предварительные требования

В следующих примерах используется Eclipse IDE вместе с Maven или системой сборки Gradle. Перейдите по следующим ссылкам, чтобы узнать об использовании Maven или Gradle в Eclipse IDE

Другие инструменты, такие как Visual Studio Code или IntelliJ, позволяют делать то же самое, поэтому вы сможете использовать свой любимый инструмент.

3. Упражнение: первый модифицированный клиент

В этом упражнении вы создадите автономный клиент REST. Ответы генерируются фиктивным сервером.

3.1. Создание и настройка проекта

Создайте новый проект Gradle с именем com.vogella.retrofitgerrit . Добавьте новый пакет в src/main/java с именем com.vogella.retrofitgerrit .

Добавьте следующие зависимости в файл build.gradle.

3.2. Определите API и адаптер Retrofit

В ответе Геррита в формате JSON нас интересует только предмет изменений. Поэтому создайте следующий класс данных в ранее добавленном пакете по умолчанию.

Определите REST API для модернизации с помощью следующего интерфейса.

Создайте следующий класс контроллера. Этот класс создает клиент Retrofit, вызывает Gerrit API и обрабатывает результат (выводит результат вызова на консоль).

Создайте класс с методом main для запуска контроллера.

4. Модернизированные преобразователи и адаптеры

4.1. Модифицированные преобразователи

Модернизация может быть настроена на использование определенного преобразователя. Этот преобразователь обрабатывает (де) сериализацию данных. Несколько конвертеров уже доступны для различных форматов сериализации.

Чтобы преобразовать в JSON и из него:

Чтобы преобразовать в протокольные буферы и обратно:

Чтобы преобразовать в XML и из него:

Простой XML: com.squareup.retrofit:converter-simplexml

Помимо перечисленных преобразователей, вы также можете создавать собственные преобразователи для обработки других протоколов, создавая подклассы класса Converter.Factory.

4.2. Адаптеры для модернизации

Модернизация также может быть дополнена адаптерами для работы с другими библиотеками, такими как RxJava 2.x, Java 8 и Guava.

Обзор доступных адаптеров можно найти на странице Github Square/retrofit/retrofit-adapters/.

Например, адаптер RxJava 2.x можно получить с помощью Gradle:

или с помощью Apache Maven:

Чтобы добавить адаптер, необходимо использовать метод retrofit2.Retrofit.Builder.addCallAdapterFactory(Factory).

При использовании этого адаптера интерфейсы Retrofit могут возвращать типы RxJava 2.x, например, Observable, Flowable или Single и т. д.

5. Модернизация аутентификации

5.1. Аутентификация с аннотациями

Предположим, вы хотите запросить данные пользователя, для чего требуется пройти аутентификацию. Это можно сделать, добавив в определение API новый параметр, например следующий:

С помощью аннотации @Header("Authorization") вы указываете Retrofit добавить поле Authorization в заголовок запроса со значением, которое вы указали для учетных данных .

Если вы хотите использовать токен API, а не обычную аутентификацию, просто вызовите метод getUserDetails(String) с вашим токеном.

Приведенный выше метод добавляет учетные данные только в том случае, если вы запрашиваете свои данные пользователя. Если у вас есть больше вызовов, требующих аутентификации, вы можете использовать для этого перехватчик. Перехватчик используется для модификации каждого запроса перед его выполнением и изменения заголовка запроса. Преимущество заключается в том, что вам не нужно добавлять @Header("Авторизация") к каждому определению метода API.

Возможно, вы снова заметили использование класса Credentials для обычной проверки подлинности. Опять же, если вы хотите использовать токен API, просто используйте вместо этого токен.

6. Упражнение: использование Retrofit для запроса Gerrit в Java

В следующем разделе описывается, как создать минимальное приложение Java, которое использует Retrofit для запроса объектов открытых изменений из Gerrit API. Результаты выводятся на консоль.

6.1. Создание и настройка проекта

В этом упражнении предполагается, что вы знакомы с Gradle и Buildship для Eclipse.

Создайте новый проект Gradle с именем com.vogella.java.retrofitgerrit . Добавьте новый пакет в src/main/java с именем com.vogella.java.retrofitgerrit .

Добавьте следующие зависимости в файл build.gradle.

6.2. Определите API и адаптер Retrofit

В ответе Геррита в формате JSON нас интересует только предмет изменений. Поэтому создайте следующий класс данных в ранее добавленном пакете по умолчанию.

Определите REST API для модернизации с помощью следующего интерфейса.

Создайте следующий класс контроллера. Этот класс создает клиент Retrofit, вызывает Gerrit API и обрабатывает результат (выводит результат вызова на консоль).

Создайте класс с методом main для запуска контроллера.

7. Упражнение: использование Retrofit для преобразования XML-ответа из RSS-канала

В этом разделе описывается использование Retrofit для преобразования ответа XML с помощью SimpleXMLConverter .

7.1. Создание и настройка проекта

В этом упражнении предполагается, что вы знакомы с Gradle и Buildship для Eclipse.

Создайте новый проект Gradle с именем com.vogella.java.retrofitxml . Добавьте новый пакет в src/main/java с именем com.vogella.java.retrofitxml .

Добавьте следующие зависимости в файл build.gradle.

7.2. Определите сопоставление XML

Канал RSS выглядит следующим образом:

Помимо заголовка XML этот файл состоит из различных элементов XML. Элемент rss содержит элемент канала, который также содержит другие элементы (например, заголовок, описание, pubDate) и несколько элементов элементов (статьи).

Создайте следующие два класса данных с именами RSSFeed и Article .

Класс Article представляет одну статью и хранит только заголовок и ссылку на нее. Это единственные поля, которые нас интересуют.

С помощью аннотации @Root класс помечается как (де)сериализованный. При желании вы можете указать имя в аннотации @Root, которое представляет имя элемента XML. Если имя не указано, имя класса используется в качестве имени элемента XML. Поскольку имя класса (RSSFeed) отличается от имени элемента XML (rss), вам необходимо указать имя.

Если для параметра strict установлено значение false , строгий синтаксический анализ отключен. Это сообщает синтаксическому анализатору, что он не должен давать сбой и выдавать исключение, если найден XML-элемент или атрибут, для которого не предусмотрено сопоставление. Так как rss-элемент имеет атрибут version, который не привязан к полю, приложение вылетит, если для него не установлено значение false.

С помощью аннотации @Element представляется XML-элемент. При желании вы можете указать имя XML-элемента, представленного этим полем. Если имя не указано, используется имя поля.

С помощью аннотации @Path вы можете указать путь к элементу XML внутри дерева XML. Это полезно, если вы не хотите моделировать полное XML-дерево с объектами Java. Для заголовка канала и нескольких элементов-элементов мы можем напрямую указать на определенные элементы внутри элемента-канала.

7.3. Определите API и адаптер Retrofit

Определите REST API для модернизации с помощью следующего интерфейса.

Создайте следующий класс контроллера. Этот класс создает клиент Retrofit, вызывает Vogella API и обрабатывает результат.

Последний шаг — создать класс с методом main для запуска контроллера.

8. Использование модификации для запросов к Restful StackOverflow API

StackOverflow — популярная сторона для вопросов, связанных с программированием. Он также предоставляет REST API, подробно описанный на странице Stackoverflow API.

В этом упражнении вы используете библиотеку Retrofit REST для запроса StackOverflow вопросов на основе тегов. Реализация также позволяет получать ответы на опубликованные вопросы.

В нашем примере мы используем следующий URL-адрес запроса. Откройте этот URL в браузере и посмотрите на ответ.

8.1. Создание и настройка проекта

Создайте новый проект Maven с именем com.vogella.stackoverflow.maven .

Добавьте следующие зависимости в файл pom.

8.2. Создать модель данных

Создайте следующие два класса данных, которые будут использоваться для хранения данных ответов из Stackoverflow.

8.3. Определите API и адаптер Retrofit

API Stackoverflow заключает ответы на вопросы или ответы в объект JSON с именем items . Чтобы справиться с этим, создайте следующий класс данных с именем ListWrapper. Это необходимо для обработки оболочки элементов Stackoverflow. Этот класс принимает параметр типа и просто упаковывает список объектов этого типа.

Определите REST API для модернизации с помощью следующего интерфейса.

8.4. Тестовая реализация

Напишите следующий тестовый класс для проверки вызова. Это отдельный тест

9. Упражнение: использование Retrofit для доступа к GitHub API в Android

В этом упражнении описывается, как получить список всех репозиториев GitHub для пользователя в приложении Android с помощью Retrofit. Вы можете выбрать репозиторий из раскрывающегося списка и перечислить задачи, назначенные пользователю для выбранного репозитория.

Затем вы можете выбрать проблему в дополнительном раскрывающемся поле и опубликовать к ней комментарий. DialogFragment используется для ввода учетных данных для аутентификации.

Убедитесь, что у вас есть учетная запись Github, так как это необходимо для этого руководства. Поскольку в этом руководстве Retrofit используется вместе с RxJava2, убедитесь, что вы также ознакомились с учебным пособием по RxJava2.

9.1. Настройка проекта

Создайте приложение для Android с именем Retrofit Github . Используйте com.vogella.android.retrofitgithub в качестве имени пакета верхнего уровня и используйте пустой шаблон. Убедитесь, что в мастере установлен флаг обратной совместимости.

Чтобы использовать Retrofit и RxJava2 CallAdapter, добавьте следующие зависимости в файл build.gradle

Добавьте разрешение на доступ в Интернет в файл манифеста.

9.2. Определить API

Создайте следующие два класса данных с именами GithubIssue и GithubRepo .

Из репозиториев в раскрывающемся поле отображаются только имя и URL-адрес репозитория. Также добавьте владельца в класс данных, так как имя владельца является обязательным для последующего запроса задач.

В раскрывающемся поле мы показываем только идентификатор и название проблемы, поэтому создайте поле для каждого из них. Кроме того, ответ от Github содержит URL-адрес для публикации комментария, который хранится в поле comments_url. Чтобы позже опубликовать новый комментарий в Github API, добавьте поле с именем комментарий. Github API указывает, что содержимое комментария должно быть привязано к полю с именем body в запросе JSON. Поскольку Retrofit (де)сериализует все поля на основе их имен и поскольку мы не хотим использовать body в качестве имени поля в нашем классе GithubIssue, мы используем аннотацию @SerializedName. С помощью этой аннотации мы можем изменить имя (де)сериализованного поля в JSON.

К сожалению, класса GithubRepo недостаточно для запроса всей необходимой информации о репозитории. Как вы можете видеть здесь, владелец репозитория — это отдельный объект JSON в ответе репозитория, и поэтому ему обычно требуется соответствующий класс Java для (де)сериализации. К счастью, Retrofit дает вам возможность добавить собственный типизированный JSONDeserializer для управления десериализацией для определенного типа. Каждый раз, когда необходимо десериализовать объект определенного типа, используется этот пользовательский десериализатор.

Для этого добавьте следующий класс с именем GithubRepoDeserialzer.

Определите REST API для модернизации с помощью следующего интерфейса:

Вы можете задаться вопросом об аннотации @Url. С помощью этой аннотации мы можем предоставить URL для этого запроса. Это позволяет нам динамически изменять URL для каждого запроса. Это нужно для поля comments_url класса GithubIssue.

Аннотация @Path привязывает значение параметра к соответствующей переменной (фигурные скобки) в URL-адресе запроса. Это необходимо для указания владельца и имени репозитория, для которого должны быть запрошены задачи

Добро пожаловать в учебное пособие по модернизации Android. Сегодня мы воспользуемся библиотекой Retrofit, разработанной Square, для обработки вызовов REST API в нашем приложении для Android.

Обновление Android

Retrofit — это типобезопасный клиент REST для Android и Java, который упрощает использование веб-служб RESTful. Мы не будем вдаваться в подробности о версиях Retrofit 1.x и сразу перейдем к версии Retrofit 2, которая имеет множество новых функций и измененный внутренний API по сравнению с предыдущими версиями.

Retrofit автоматически сериализует ответ JSON, используя POJO (обычный старый объект Java), который должен быть определен заранее для структуры JSON. Чтобы сериализовать JSON, нам нужен конвертер, чтобы сначала преобразовать его в Gson. Нам нужно добавить следующие зависимости в наш файл build.grade.

Добавьте разрешение на доступ в Интернет в файл AndroidManifest.xml.

Настройка интерфейса модификации

Давайте посмотрим, как выглядит наш класс APIInterface.java.

@GET("/api/unknown") вызывает doGetListResources(); .

doGetListResources() — это имя метода. MultipleResource.java — это класс POJO модели для нашего объекта ответа, который используется для сопоставления параметров ответа с соответствующими переменными. Эти классы POJO действуют как тип возвращаемого значения метода.

Ниже приведен простой класс POJO для MultipleResources.java.

Аннотация @SerializedName используется для указания имени поля в ответе JSON.

 Учебное пособие по модернизации Android-примера json schema

Просмотрите класс POJO и скопируйте его в структуру проекта Android Studio.

Классы POJO заключены в типизированный класс Retrofit Call.

Примечание. JSONArray представляет собой сериализованный список объектов в классах POJO

Параметры метода. Существует множество возможных вариантов параметров для передачи внутри метода:

  • @Body — отправляет объекты Java в виде тела запроса.
  • @Url — используйте динамические URL-адреса.
  • @Query — мы можем просто добавить параметр метода с помощью @Query() и имя параметра запроса, описывающее тип. Чтобы URL-кодировать запрос, используйте форму:
    @Query(value = "auth_token",encoded = true) String auth_token
  • @Field — отправлять данные в формате form-urlencoded. Для этого требуется аннотация @FormUrlEncoded, прикрепленная к методу.
    Параметр @Field работает только с POST

Примечание. Для @Field требуется обязательный параметр. В тех случаях, когда @Field является необязательным, вместо него можно использовать @Query и передать нулевое значение.

Модернизация структуры примера проекта Android

модификация Android пример учебника, учебник по модернизации 2

Пакет pojo определяет четыре класса моделей для каждого из ответов конечной точки API, определенных в классе APIInterface.java.

Приведенный выше класс используется для создания тела ответа для метода createUser()

В файле MainActivity.java мы вызываем каждую конечную точку API, определенную в классе интерфейса, и отображаем каждое из полей в Toast/TextView.

apiInterface = APIClient.getClient().create(APIInterface.class); используется для создания экземпляра APIClient.
Чтобы сопоставить класс модели с ответом, который мы используем:

Ресурс MultiResource = response.body();

Запуск приложения вызывает каждую конечную точку и отображает всплывающее сообщение для них соответственно.

На этом пример учебника по дооснащению Android заканчивается. Вы можете скачать пример проекта Android Retrofit по ссылке ниже.

Учебное пособие по использованию ConstraintLayout для Android

Он любит изучать новые вещи на Android и iOS. Стреляйте в него вопросами.

Комментарии

импортировать com.google.gson.Gson;
импортировать com.google.gson.GsonBuilder;

открытый класс RetrofitClient

retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(builder.build())
.сборка();

публичный статический синхронизированный RetrofitClient getInstance()

if(retrofitClient==null) retrofitClient=new RetrofitClient();
>
вернуть модифицированный клиент;
>

публичный API getApi() return retrofit.create(Api.class);
>

Пожалуйста, помогите мне, как я могу сохранить в sqlite

Используйте этот проект, чтобы мне помочь, а затем реализовать мой @GET, muito obrigado.

импортировать android.support.v7.app.AppCompatActivity;
импорт android.os.Bundle;
импортировать android.util.Log;
импорт android.widget.TextView;
импортировать android.widget.Toast;

импортировать модификацию2.Вызов;
импортная модернизация2.Обратный звонок;
импортировать модификацию2. Ответ;

открытый класс MainActivity расширяет AppCompatActivity

TextView responseText;
APIИнтерфейс apiInterface;

@Override
protected void onCreate(Bundle saveInstanceState) super.onCreate(savedInstanceState);
setContentView(R.layout.активность_основная);
responseText = (TextView) findViewById(R.id.responseText);
apiInterface = APIClient.getClient().create(APIInterface.class);

/**
GET List Resources
**/
Call call = apiInterface.doGetListResources();
call.enqueue(новый обратный вызов() @Override
public void onResponse(вызов вызова, ответный ответ)

Ресурс MultiResource = response.body();
Целочисленный текст = resource.page;
Целое число = resource.total;
Целое число totalPages = resource.totalPages;
Список данныхList = resource.data;

displayResponse += текст + "Страница\n" + общее количество + "Всего\n" + общее количество страниц + "Всего страниц\n";

для (MultipleResource.Datum datum : datumList) displayResponse += datum.id + ” ” + datum.name + ” ” + datum.pantoneValue + ” ” + datum.year + «\n»;
>

@Override
public void onFailure(Call call, Throwable t) call.cancel();
>
>);

/**
Создать нового пользователя
**/
Пользователь user = new User(“morpheus”, “leader”);
Вызов call1 = apiInterface.createUser(user);
call1.enqueue(новый обратный вызов() @Override
public void onResponse(вызов вызова, ответный ответ) Пользователь user1 = response.body();

Toast.makeText(getApplicationContext(), user1.name + ” ” + user1.job + ” ” + user1.id + ” ” + user1.createdAt, Toast.LENGTH_SHORT).show();

@Override
public void onFailure(Call call, Throwable t) call.cancel();
>
>);

/**
GET List Users
**/
Call call2 = apiInterface.doGetUserList("2");
call2.enqueue(новый обратный вызов() @Override
public void onResponse(вызов вызова, ответный ответ)

Список пользователей userList = response.body();
Целочисленный текст = userList.page;
Целое число = userList.total;
Целое число totalPages = userList.totalPages;
Список данныхList = userList.data;
Toast.makeText(getApplicationContext(), text + "page\n" + total + " total\n" + totalPages + " totalPages\n", Toast.LENGTH_SHORT).show();

для (UserList.Datum datum : datumList) Toast.makeText(getApplicationContext(), «id:» + datum.id + «имя:» + datum.first_name + » » + datum.last_name + » аватар: » + datum.avatar, Toast.LENGTH_SHORT).show();
>

@Override
public void onFailure(Call call, Throwable t) call.cancel();
>
>);

/**
Имя POST и URL задания закодированы.
**/
Call call3 = apiInterface.doCreateUserWithField("morpheus","leader");
call3.enqueue(новый обратный вызов() @Override
public void onResponse(вызов вызова, ответный ответ) UserList userList = response.body();
Integer text = userList.page;
/>Целое число = userList.total;
Целое число totalPages = userList.totalPages;
List datumList = userList.data;
Toast.makeText(getApplicationContext(), text + ”page\n” + total + ” total\n” + totalPages + ” totalPages\n”, Toast.LENGTH_SHORT).show();

для (UserList.Datum datum : datumList) Toast.makeText(getApplicationContext(), «id:» + datum.id + «имя:» + datum.first_name + » » + datum.last_name + » аватар: » + datum.avatar, Toast.LENGTH_SHORT).show();
>

@Override
public void onFailure(Call call, Throwable t) call.cancel();
>
>);

Пожалуйста, уменьшите размер панели управления

Здравствуйте.
Похоже, что POST-код в вашем коде неверен.

Разве это неправильно?

/**
Имя POST и URL задания закодированы.
**/
Call call3 = apiInterface.doCreateUserWithField("morpheus","leader");
call3.enqueue(новый обратный вызов() @Override
public void onResponse(вызов вызова, ответный ответ) CreateUserResponse createUserResponse = response.body();
Имя строки = createUserResponse.name;
String job = createUserResponse.job;
String /> String createdAt = createUserResponse.createdAt;

Toast.makeText(
RestApiTestActivity.this,
name +” name\n”
+ job + “ job\n”
+ id + “ id\n”
+ createdAt, Toast.LENGTH_SHORT).show();
>

@Override
public void onFailure(Call call, Throwable t) call.cancel();
>
>);

Привет,
У меня есть один вопрос?
если я ищу реализацию API в проекте с использованием модификации, это использует многократное обращение к серверу по времени при нажатии клавиши. Итак, моя проблема в том, что это не будет работать должным образом.

Вы можете использовать метод Debouncer. Обратитесь к RxJava

Привет, есть ли способ проверить параметры, переданные в API? Потому что, когда я пытаюсь вызвать API с аннотацией сообщения и передать объект класса pojo, API не может прочитать параметры.

как мы можем сказать или узнать при модификации, что он доходит до конца файла json?

Зачем вам это знать?

Здравствуйте,
как я могу привязать целочисленное значение к textview.

Здравствуйте! Я заметил, что APIClient объявляет объект Retrofit и метод getClient статическими.
И в MainActivity.java есть только один экземпляр APIInterface.Пока у нас есть только один объект APIInterface в приложении, он имитирует одноэлементный шаблон

Когда мы создаем экземпляр второго объекта, например. скажем, apiInterface2, это не то же самое, что apiInterface, что означает, что это не одноэлементный класс.

Как здесь реализовать по-настоящему одноэлементный шаблон даже для APIInterface?

Создайте синхронизированный метод getInstance, который возвращает экземпляр модификации.
Но это может привести к проблемам с производительностью. Синхронизация — дорогостоящий вариант многопоточности.

@Jayant Bhave
.execute вызовет исключение networkOnMainThread. Если мы хотим совершать последующие вызовы только в случае успешного выполнения предыдущего вызова, то вот как сделать эти вызовы синхронными. Переместите последующие вызовы в метод onResponse предыдущего вызова. Вызовы по-прежнему асинхронны, но результат будет синхронным.

открытый класс MainActivity расширяет AppCompatActivity

TextView responseText;
APIИнтерфейс apiInterface;

@Override
protected void onCreate(Bundle saveInstanceState) super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
responseText = (TextView) findViewById(R.id.responseText);
responseText.setMovementMethod(new ScrollingMovementMethod());
apiInterface = APIClient.getClient().create(APIInterface.class);//getClient возвращает объект Retrofit, а create возвращает объект интерфейса

/**
GET List Resources
**/
public void MakeCallRequest() Call call = apiInterface.doGetListResources();
call.enqueue(новый обратный вызов() @Override
public void onResponse(вызов вызова, ответный ответ)

Ресурс MultiResource = response.body();
Целочисленный текст = resource.page;
Целое число = resource.total;
Целое число totalPages = resource.totalPages;
Список данныхList = resource.data;

displayResponse += текст + "Страница\n" + общее количество + "Всего\n" + общее количество страниц + "Всего страниц\n";

для (MultipleResource.Datum datum : datumList) displayResponse += datum.id + ” ” + datum.name + ” ” + datum.pantoneValue + ” ” + datum.year + «\n»;
>

@Override
public void onFailure(Call call, Throwable t) responseText.append("Call doGetListResources FAILED ****");//Добавлено Jayant
call.cancel();
>
>);
>

/**
Создать нового пользователя
**/
public void MakeCall1Request() User user = new User(“morpheus”, “leader”);
Вызов call1 = apiInterface.createUser(user);
call1.enqueue(новый обратный вызов() @Override
public void onResponse(вызов вызова, ответный ответ) Пользователь user1 = response.body();

Toast.makeText(getApplicationContext(), user1.name + ” ” + user1.job + ” ” + user1.id + ” ” + user1.createdAt, Toast.LENGTH_LONG).show();
String strCall1Response = user1.name + ” ” + user1.job + ” ” + user1.id + ” ” + user1.createdAt;
responseText.append("\n********************************************* ************\n” +”Call1 createUser” + “\n”);//Добавлен Jayant
responseText.append(strCall1Response);//Добавлен Jayant
Вызов2Запрос();
>

@Override
public void onFailure(Call call, Throwable t) responseText.append("Call1 createUser FAILED ****");//Добавлено Jayant
call.cancel();
>
>);
>

/**
GET List Users
**/
public void MakeCall2Request() Call call2 = apiInterface.doGetUserList("2");
call2.enqueue(новый обратный вызов() @Override
public void onResponse(вызов вызова, ответный ответ)

Список пользователей userList = response.body();
Целочисленный текст = userList.page;
Целое число = userList.total;
Целое число totalPages = userList.totalPages;
Список данныхList = userList.data;
Toast.makeText(getApplicationContext(), text + "page\n" + total + " total\n" + totalPages + " totalPages\n", Toast.LENGTH_LONG).show();

для (UserList.Datum datum : datumList) Toast.makeText(getApplicationContext(), «id:» + datum.id + «имя:» + datum.first_name + » » + datum.last_name + » аватар: » + datum.avatar, Toast.LENGTH_LONG).show();
String strCall2Response = «id : » + datum.id + » name: » + datum.first_name + » » + datum.last_name + » аватар: » + datum.avatar + «\n»;
responseText.append(strCall2Response);//Добавлено Джаянтом
>
MakeCall3Request();

@Override
public void onFailure(Call call, Throwable t) responseText.append("Call2 doGetUserList FAILED ****");//Добавлено Jayant
call.cancel();
>
>);
>

/**
Имя POST и URL задания закодированы.
**/
public void MakeCall3Request() Call call3 = apiInterface.doCreateUserWithField("morpheus", "leader");
call3.enqueue(новый обратный вызов() @Override
public void onResponse(вызов вызова, ответный ответ) UserList userList = response.body();
Integer text = userList.page;
/>Целое число = userList.total;
Целое число totalPages = userList.totalPages;
List datumList = userList.data;
Toast.makeText(getApplicationContext(), text + ” page\n” + total + ” total\n” + totalPages + ” totalPages\n”, Toast.LENGTH_LONG).show();

для (UserList.Datum datum : datumList) Toast.makeText(getApplicationContext(), «id:» + datum.id + «имя:» + datum.first_name + » » + datum.last_name + » аватар: » + datum.avatar, Toast.LENGTH_LONG).show();
String strCall3Response = «id : » + datum.id + » name: » + datum.first_name + » » + datum.last_name + » аватар: » + datum.avatar;
responseText.append(strCall3Response);
>

@Override
public void onFailure(Call call, Throwable t) responseText.append("Call3 doCreateUserWithField FAILED ****");//Добавлено Jayant
call.cancel();
>
>);

Здравствуйте!
Это отличный пример поста о модернизации.

Я заметил, что ответ на вызов, вызов1, вызов2 и вызов3 приходят в случайном порядке, даже если они были вызваны в последовательности вызов, вызов1, вызов2 и вызов3.

Как сделать так, чтобы они блокировались, т. е. не вызывали call2 до завершения call1?

спасибо за пост.. очень полезно

шаг 1
открытый класс ApiClient private static Retrofit retrofit = null;

private static Gson gson = new GsonBuilder()
.setLenient()
.create();

public static Retrofit getClient(String baseUrl) if(retrofit == null) retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create(gson)) < бр />.build();
>

public static AccountService getAccountService() return ApiClient.getClient(BASE_URL).create(AccountService.class);
>

общедоступный интерфейс AccountService

@POST("account_register")
Вызов doRegister (@Body account.register.Request registerRequest);

@POST("account_login")
Вызов doLogin(@Body Request loginRequest);

@POST("account_logout")
Вызов doLogOut(@Bodyaccount.profile.Request logoutRequest);

@Multipart
@POST("account_profile_upload-profile")
Call doUploadImage(@Part MultipartBody.Part file, @Part("user_id") RequestBody userId, @Part("sort_order") RequestBody picOrder);

@GET("account_profile_upload-profile/")
Вызов doGetProfileImages(@Path("user_id") int user_id);

@DELETE("account_profile_upload-profile/id/"+"/sort_order/")
Вызов doRemoveImage(@Path("id") int user_id,@Path("sort_order")String sort_order);< /p>

вызвать модификацию основной деятельности
private AccountService accountService;

Читайте также: