Изучаем Retrofit 2


В мире Android разработки существует множество интересных библиотек, и сегодня мы рассмотрим детище компании SquareRetrofit. Что же это за зверь такой? Retrofit (согласно официальному сайту) — типобезопасный HTTP-клиент для Android и Java. Он является незаменимым инструментом для работы с API в клиент-серверных приложениях. Каких-то лет 5 назад Android-разработчикам для работы с сетью приходилось воротить горы кода с обратными вызовами, AsyncTask’ами и прочими «низкоуровневыми» вещами. И компания Square выпустила такую замечательную библиотеку — Retrofit.

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

Лучше один раз увидеть, чем сто раз услышать

Мы будем создавать приложение, получающее данные от API сайта Umorili, так как только они предоставляют данные с баша в удобном для парсинга виде. Вот так будет выглядеть конечный вариант:

Дизайном, конечно, не блещет

Ну что, дети, вы готовы?

Зависимости

Библиотеку Retrofit можно подключить тремя способами: Gradle, Maven, Jar. Опишем каждый способ.

Gradle

В большинстве случаев для сборки приложений под Android используется именно этот инструмент, поэтому, если вы не уверены, берите этот вариант :) (здесь и далее для зависимостей будут использоваться Gradle).

Для подключения в файл build.gradle модуля приложения в раздел dependencies вставляем строчку:

Maven

Если кто-то использует эту систему зависимостей и сборки, то фрагмент зависимости будет выглядеть так:

Jar

Не приветствую использование этого варианта, но некоторые любят его. Скачиваем с официального сайта jar-файл (ссылка) и кидаем его в папку libs.

Помимо самой библиотеки нам понадобится парсер JSON и RecyclerView-v7, поэтому подключим их:

 

С зависимостями разобрались, теперь перейдем к самой сладкой части — разработке. Перво-наперво нам нужно описать запросы к API, поэтому.

Описание запросов к API

Retrofit позволяет сделать полноценный REST-клиент, который может выполнять POST, GET, PUT, DELETE. Для обозначения типа и других аспектов запроса используются аннотации. Например, для того, чтобы обозначить, что требуется GET запрос, нам нужно написать перед методом GET, для POST запроса POST, и так далее. В скобках к типу запроса ставится целевой адрес. Для примера возьмем API GitHub’а. Полный URL для получения списка репозиториев определенного пользователя можно представить в виде https://api.github.com/users/octocat/repos, где:

  • api.github.com — базовая часть адреса (всегда оканчивается слешем)
  • users/{user}/repos — метод (адрес документа, целевой адрес), где определенного пользователя (octocat) мы заменили на алиас (про использование алиасов чуть позже)

Еще существуют параметры запроса, например в запросе к Umorili мы будем использовать следующий адрес — http://www.umori.li/api/get?name=bash&num=50, где name=bash&num=50 — параметры.

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

 

Разберем этот интерфейс. У нас есть метод getData, возвращающий объект типа Call<List<PostModel>>. Методы должны всегда возвращать объект типа Call<T> и иметь аннотацию типа запроса (GET, POST, PUT, DELETE).

Аннотация @Query("name") String resourceName показывает Retrofit’у, что в качестве параметра запроса нужно поставить пару name=<Значение строки resourceName>.

Если у нас в целевом адресе стоит алиас, то для того, чтобы заместо алиаса поставить значение, нам нужно в параметрах функции написать @Path("<Название аласа>") SomeType variable, где SomeType — любой тип (например, String, int, float).

PostModel — класс, сгенерированный сайтом jsonschema2pojo на основе ответа сервера.

Подготовка к запросу

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

 

P.S. не забываем в манифесте прописать, что используем свой класс Application

Теперь из любого класса мы имеем доступ к API.

Получение данных

Мы можем выполнять запросы (и, следовательно, получать данные) двумя способами — синхронными а асинхронными запросами. Для синхронного (блокирующего) получения мы используем метод execute() у объекта типа Call. Для нашего примера код был бы следующим:

В результате выполнения мы получаем объект типа Response (ответ), откуда мы можем уже получить распарсенный ответ методом body().

Для асинхронного получения мы заменяем execute() на enqueue(), где в параметрах передаем функции обратного вызова (колбэки). В нашем примере будет выглядеть примерно так:

 

Делаем отображение данных

Данные мы уже получили, а как и теперь отобразить? Кидаем в разметку активности RecyclerView и как-нибудь его обзываем. После этого создаем разметку для элемента.

Вот что получилось у меня:


После создаем адаптер для RecyclerView:


И прописываем в MainActivity.java инициализацию RecyclerView, адаптера, а так же получение данных.


 

На GitHub’е вы можете найти полный код данного приложения.

via Михаил Мустакимов @Mihail57

Оставьте комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *