Одним из самых интересных анонсов Google I/O в этом году стала официальная поддержка Kotlin для разработки под Android. Kotlin на самом деле не новый язык, ему уже более 5 лет, и он достаточно зрелый.
Здесь вы можете получить дополнительную информацию о языке Я планирую поделиться некоторыми «практиками» использования Kotlin в разработке для Android. Retrofit — очень популярная сетевая библиотека, широко используемая сообществом разработчиков.
Даже Google использует его в своих примерах кода.
В этой статье я расскажу о том, как использовать REST API в своих приложениях с помощью Retrofit + Kotlin + RxJava. Мы будем использовать API Github, чтобы получить список разработчиков Java в Омске, Россия.
Я также коснусь некоторых особенностей языка программирования и расскажу о том, как мы можем применить их к тому, что мы, разработчики Android, делаем каждый день — вызываем API.
0. Установка
Android Studio 3.0 (предварительная версия) теперь имеет встроенную поддержку Kotlin без установки плагинов вручную.Отсюда вы можете установить предварительную версию.
1. Добавление зависимостей
Использовать Модернизация , вам нужно добавить зависимости в файл build.gradle :RxJava2 поможет сделать наши вызовы реактивными.dependencies { // retrofit compile "com.squareup.retrofit2:retrofit:2.3.0" compile "com.squareup.retrofit2:adapter-rxjava2:2.3.0" compile "com.squareup.retrofit2:converter-gson:2.3.0" // rxandroid compile "io.reactivex.rxjava2:rxandroid:2.0.1" }
Конвертер GSON будет обрабатывать десериализацию и сериализацию тел запросов и ответов.
RxAndroid поможет нам с привязкой RxJava2 к Android.
2. Создайте классы данных
Обычно следующим шагом является создание классов данных, которые представляют собой POJO (простые старые объекты Java), которые будут представлять ответы на вызовы API. С помощью API Github пользователи будут представлены в виде объектов.
Вот как это будет выглядеть в Котлине: data class User(
val login: String,
val id: Long,
val url: String,
val html_url: String,
val followers_url: String,
val following_url: String,
val starred_url: String,
val gists_url: String,
val type: String,
val score: Int
)
Классы данных в Котлине
Классы данных в Kotlin — это классы, специально разработанные для хранения данных.Компилятор Kotlin автоматически помогает нам реализовать методы равно() , хэш-код() И нанизывать() в классе, что делает код еще короче, поскольку нам не нужно делать это самостоятельно.
Мы можем переопределить реализацию любого из этих методов по умолчанию, определив метод. Замечательной особенностью является то, что мы можем создавать результаты поиска в одном файле Kotlin, скажем, SearchResponse.kt .
Наш окончательный класс ответа поиска будет содержать все связанные классы данных и выглядеть следующим образом: SearchResponse.kt data class User(
val login: String,
val id: Long,
val url: String,
val html_url: String,
val followers_url: String,
val following_url: String,
val starred_url: String,
val gists_url: String,
val type: String,
val score: Int
)
data class Result (val total_count: Int, val incomplete_results: Boolean, val items: List<User>)
3. Создайте API
Следующий шаг, который мы обычно делаем на Java, — это создание API, который мы будем использовать для создания запросов и получения ответов.
Обычно в Java я хотел бы создать удобный «фабричный» класс, который при необходимости создает службу API, и я бы сделал что-то вроде этого: GithubApiService.java public interface GithubApiService {
@GET("search/users")
Observable<Result> search(@Query("q") String query, @Query("page") int page, @Query("per_page") int perPage);
/**
* Factory class for convenient creation of the Api Service interface
*/
class Factory {
public static GithubApiService create() {
Retrofit retrofit = new Retrofit.Builder()
.
addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .
addConverterFactory(GsonConverterFactory.create()) .
baseUrl(" https://api.github.com/ ") .
build();
return retrofit.create(GithubApiService.class);
}
}
}
Чтобы использовать этот интерфейс, мы делаем следующие вызовы: GithubApiService apiService = GithubApiService.Factory.create();
apiService.search(/** search parameters go in here **/);
Чтобы повторить то же самое в Котлине, у нас будет эквивалентный интерфейс GithubApiService.kt , который будет выглядеть так: GithubApiService.kt interface GithubApiService {
@GET("search/users")
fun search(@Query("q") query: String,
@Query("page") page: Int,
@Query("per_page") perPage: Int): Observable<Result>
/**
* Companion object to create the GithubApiService
*/
companion object Factory {
fun create(): GithubApiService {
val retrofit = Retrofit.Builder()
.
addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .
addConverterFactory(GsonConverterFactory.create()) .
baseUrl(" https://api.github.com/ ") .
build()
return retrofit.create(GithubApiService::class.java);
}
}
}
Использование этого интерфейса и фабричного класса будет выглядеть так: val apiService = GithubApiService.create()
apiService.search(/* search params go in here */)
Обратите внимание: нам не нужно было использовать «имя» сопутствующего объекта для ссылки на метод, мы просто использовали имя класса.
Синглтоны и связанные объекты в Котлине
Чтобы понять, каковы связанные объекты в Котлине, мы должны сначала понять, каковы объявления объектов в Котлине.Объявление объекта в Котлине — это способ создания отдельного элемента в Котлине.
Синглтоны в Котлине так же просты, как объявление объекта и присвоение ему имени.
Например: object SearchRepositoryProvider {
fun provideSearchRepository(): SearchRepository {
return SearchRepository()
}
}
Используя приведенное выше объявление объекта: val repository = SearchRepositoryProvider.provideSearchRepository();
Благодаря этому мы смогли создать провайдера, который предоставит нам экземпляр репозитория (который поможет нам подключиться к API Github через GithubApiService).
Объявление объекта инициализируется при первом доступе — точно так же, как работает Singleton. Однако, сопутствующие объекты — это тип объявления объекта, соответствующий ключевому слову-компаньону.
Сопутствующие объекты можно сравнить со статическими методами или полями в Java. Фактически, если вы ссылаетесь на сопутствующий объект в Java, он отображается как статический метод или поле.
Сопутствующий объект — это то, что используется в версии Kotlin GithubApiService.kt, указанной выше.
4. Создание репозитория
Поскольку мы пытаемся максимально абстрагировать наши процессы, мы можем создать простой репозиторий, который обрабатывает вызов GithubApiService и строит строку запроса.Строка запроса, соответствующая нашей спецификации для этого демонстрационного приложения (для поиска разработчиков Java в Омске) с использованием API Github, имеет вид location: Omsk + язык: Java, поэтому мы создадим в репозитории метод, который позволит нам построить эту строку, передача местоположения и языка в качестве параметров.
Наш репозиторий поиска будет выглядеть так: class SearchRepository(val apiService: GithubApiService) {
fun searchUsers(location: String, language: String): Observable<Result> {
return apiService.search(query = "location:$location+language:$language")
}
}
Строковые шаблоны в Котлине
В приведенном выше блоке кода мы использовали функцию Kotlin под названием «Шаблоны строк» для построения строки запроса.Строковые шаблоны начинаются со знака доллара — $, а значение следующей за ним переменной объединяется с остальной частью строки.
Это функция, аналогичная интерполяции строк в groovy.
5. Сделайте запрос и получите ответ API с помощью RxJava.
Теперь, когда мы настроили наши классы ответов и интерфейс нашего репозитория, мы можем сделать запрос и получить ответ API с помощью RxJava. Этот шаг аналогичен тому, как мы это делаем в Java. В коде Котлина это выглядит так: val repository = SearchRepositoryProvider.provideSearchRepository()
repository.searchUsers("Omsk", "Java")
.
observeOn(AndroidSchedulers.mainThread())
.
subscribeOn(Schedulers.io())
.
subscribe ({
result ->
Log.d("Result", "There are ${result.items.size} Java developers in Lagos")
}, { error ->
error.printStackTrace()
})
Мы сделали запрос и получили ответ. Теперь мы можем делать с ним все, что захотим.
Полезные ссылки:
- Объявление об официальной поддержке Kotlin для разработки Android совместно с Google
- Классы данных в Котлине
- Объекты в Котлине
- Ленивая инициализация синглтонов
- Строковые шаблоны в Котлине
Заключение
Итак, в этом посте мы рассмотрели некоторые интересные функции/свойства языка Kotlin и то, как их можно использовать при использовании Retrofit + RxJava для сетевых вызовов.Затронутый:
- Классы данных
- Объявления объектов
- Связанные объекты
- Струнные шаблоны
- Совместимость с Java
-
Как Я Хотел Заработать На Хорошей Корпорации
19 Oct, 24 -
Funtastic.ru - Не Скучно, Занимательно!
19 Oct, 24 -
Firefox: Устаревшие Вкладки
19 Oct, 24