- Safe Retrofit calls extension with kotlin Coroutines for Android in 2021 — Part I
- ChristopherME/movies-android
- Movies is a simple project to study and play with some android components, architecture and tools for Android…
- What’s the problem?
- Are there any solutions?
- Coroutines to the rescue
- Let’s wrap it all together
- Android LiveData на Kotlin с использованием Retrofit и coroutines
- Retrofit на Android с Kotlin
- 0. Установка
- 1. Добавление зависимостей
- 2. Создание классов данных
- Классы данных в Котлине
- 3. Создание API-интерфейса
- Синглтоны и сопутствующие объекты в Котлине
- 4. Создание репозитория
- Строковые шаблоны в Котлине
- 5. Делаем запрос и получаем ответ API при помощи RxJava
- Полезные ссылки:
- Заключение
- Retrofit with Kotlin-Android
Safe Retrofit calls extension with kotlin Coroutines for Android in 2021 — Part I
Hello 👋, today Im going to teach you how to execute network calls with retrofit in a safe and kotlin idiomatic way. At the end of this small series you could end up with something like this:
The gist from above is showing you how is executed the retrofit call and handle the result failure or success in your ViewModel / Presenter/ etc.
If you don’t understand the content of the gist, don’t worry I will go step by step in a very resumed but concrete explanation.
If you want to go straight to the code, checkout this playground project I made about movies.
ChristopherME/movies-android
Movies is a simple project to study and play with some android components, architecture and tools for Android…
What’s the problem?
First thing first, why do you need coroutines for execute a network call (with retrofit or any other HTTP client)? Well my friend, as you already know (or probably not) when you start your android apps it creates a new Linux process with a single thread (main thread or UI thread if you want). This thread is in charge of drawing your view components, widgets, etc. Everything related to the UI. It is completely forbidden to do other things on this thread because the app can crash. Check out the official docs for more detailed information.
Now we know that we are not allowed to perform heavy tasks like network calls, database operations, read/write files on the UI thread cause it will get laggy and we could get an ANR exception and our apps will crash.
Are there any solutions?
In the old android coding times people used to create their own Thread Pools and manage the creation and maintenance of the threads by themselves 🤯! Believe me kiddo, that is not something you wanna go into. Other solutions imply AsyncTasks which wasn’t so flexible and is deprecated now. Those where real though years. My respect for all those developers who are developing android apps since there.
Then, as the platform where evolving also the challenges, and the way to overcome those challenges require new and more flexible approaches. That’s when RxJava was the new savior for Android Apps. RxJava is a good solution for asynchronous tasks, but it comes with it’s own pitfalls:
- A long learning curve. It wasn’t easy to understand at the first time, because you have to change your mindset to a reactive programming one with a lot of operators and marbel diagrams 😵.
- It adds like 2MB+ to your final APK size
- It was like killing a bug with a bazooka. You probably wouldn’t use the 50% of utilities from that library, and only use it for one problem, asynchronous task.
Coroutines to the rescue
In 2017 Google made official the use of Kotlin for Android Development and since there things where evolving really fast. They come out with a incorporated solution for asynchronous tasks in the 1.1 version of the language, the famous Coroutines. This was an out of the box solution for those who where coding in Kotlin!
A coroutine is an instance of suspendable computation. It is conceptually similar to a thread, in the sense that it takes a block of code to run that works concurrently with the rest of the code. However, a coroutine is not bound to any particular thread. It may suspend its execution in one thread and resume in another one.
Coroutines can be thought of as light-weight threads, but there is a number of important differences that make their real-life usage very different from threads.
Let’s wrap it all together
In order to execute a network call safely we need to do the following things:
- Ensure that it is not being executed in the main thread — Coroutine Dispatchers is going to be our tool here.
- We probably gonna need to parse some backend error response too — We are going to use Moshi for parsing JSON.
- If we want, we could add some kind of a middleware functionality in order to execute our network call only if all those middlewares are conditions are supplied. — This is optional.
We got our requirements for our network call extension wrapper, bu there is one question floating in the air… how are the exceptions handled with coroutines 🤔?
Exceptions are handled very straight forward with a try catch block. Look at this blog from Manuel Vivo talking about it. In fact, we are also going to handle our exceptions with a try catch block under the hood 🤫 but, we are not going to pass the exception through the layers of our app.
Instead of that, we are going to pass custom Failures wrapped in our awsome “Either” class (you can find similar implementations even in google samples, like this Result sealed class).
The Either class is just a sealed class that can be a Error or a Success object at a given time. It also contain some extra methods I implement for perform some kind of map operations based on the Arrow functional programming library. The Either class is nothing new, I discovered when I was reading this amazing article from Fernando Cejas.
If you don’t know what sealed classes are, check out this video from Florina Muntenescu
We have our basis set up, time to code. Check out part 2 👉 here.
Источник
Android LiveData на Kotlin с использованием Retrofit и coroutines
Так же рассмотрен пример применения современного Coroutines в связке с репозитарием на Retrofit
Retrofit coroutines extension
kotlin-coroutines-retrofit
Расширение для Retrofit на Kotlin. Это всего два файла. Я просто добавил их в проект. Вы можете подключить их через Dependency в Gradle. На Github есть примеры использования.
Также подключаем Adapter addCallAdapterFactory(CoroutineCallAdapterFactory()).
ServerAPI и Repository находятся в одном файле
Реализацией REST API на Kotlin. Она не имеет каких либо специфичных изменений
Далее рассмотрим Repository. Это основной сервис получения LiveData. Инициализируем LiveData состоянием загрузки: Resource.loading(null). Далее ожидаем окончание запроса awaitResult() Этот вызов должен быть в блоке Coroutin async(UI)
По окончанию запроса мы можем хэндлить результат. Если все хорошо результат будет сохранен в mutableLiveData.value = Resource.success(result.value) Важный момент — это должена быть ссылка на новый экземпляр, иначе observer LiveData не отработает. see: new Resource<>(SUCCESS, data, null);
Для обработки ошибок и передачи состояния в Fragment используется Wrapper — Resource .
Он хранить три состояния:
StoresViewModel запрашивает данные у репозитория и сохраняет во внутренней переменной stores
Для передачи параметров в ViewModel расширим стандартную ViewModelProviders
Например для передачи в LoginViewModel надо два параметра (Login,Password). Для передачи токена в StoresViewModel используется один (Token)
Использование наблюдателя Observer за изменением данных:
Для хранения Token и использования его во всем приложении я применил библиотеку/расширение от Fabio Collini. Применение хорошо описано в его статье. Ссылка есть на странице в Github или ниже в этой статье.
Источник
Retrofit на Android с Kotlin
Одним из самых захватывающих объявлений на Google I/O в этом году стала официальная поддержка Kotlin для разработки под Android.
Котлин на самом деле не новый язык, ему уже >5 лет и он довольно зрелый. Здесь вы можете получить более подробную информацию о языке
Я планирую поделиться некоторыми «практиками» использования Kotlin в разработке Android.
Retrofit — очень популярная библиотека для работы с сетью, и она широко используется в сообществе разработчиков. Даже Google использует его в своих образцах кода.
В этой статье я расскажу о том, как использовать REST API в ваших приложениях с помощью Retrofit + Kotlin + RxJava. Мы будем использовать API Github для получения списка разработчиков Java в Омске, Россия. Также, я затрону некоторые особенности языка программирования и расскажу о том, как мы можем применять их к тому, что мы, разработчики Android, делаем ежедневно — вызывать API.
0. Установка
В Android Studio 3.0 (Preview) теперь есть встроенная поддержка Kotlin, без ручной установки плагинов. Отсюда можно установить preview-версию.
1. Добавление зависимостей
Чтобы использовать Retrofit, вам нужно добавить зависимости в файл build.gradle:
RxJava2 поможет сделать наши вызовы реактивными.
GSON-конвертер будет обрабатывать десериализацию и сериализацию тел запроса и ответа.
RxAndroid поможет нам с привязкой RxJava2 к Android.
2. Создание классов данных
Как правило, следующим шагом является создание классов данных, которые являются POJO (Plain Old Java Objects) и которые будут представлять ответы на вызовы API.
С API Github пользователи будут представлены как объекты.
Как это будет выглядеть на Kotlin:
Классы данных в Котлине
Классы данных в Kotlin — это классы, специально разработанные для хранения данных.
Компилятор Kotlin автоматически помогает нам реализовать методы equals (), hashCode () и toString () в классе, что делает код еще короче, потому что нам не нужно это делать самостоятельно.
Мы можем переопределить реализацию по умолчанию любого из этих методов путем определения метода.
Отличной особенностью является то, что мы можем создавать результаты поиска в одном файле Kotlin — скажем, SearchResponse.kt. Наш окончательный класс ответа на поиск будет содержать все связанные классы данных и выглядеть следующим образом:
SearchResponse.kt
3. Создание API-интерфейса
Следующим шагом, который мы обычно делаем в Java, является создание интерфейса API, который мы будем использовать для создания запросов и получения ответов.
Как правило, в Java я хотел бы создать удобный «фабричный» класс, который создает службу API, когда это необходимо, и я бы сделал что-то вроде этого:
GithubApiService.java
Чтобы использовать этот интерфейс, мы делаем следующие вызовы:
Чтобы повторить тоже самое в Котлине, у нас будет эквивалентный интерфейс GithubApiService.kt, который будет выглядеть так:
GithubApiService.kt
Использование этого интерфейса и фабричного класса будет выглядеть так:
Обратите внимание, что нам не нужно было использовать «имя» сопутствующего объекта для ссылки на метод, мы использовали только имя класса.
Синглтоны и сопутствующие объекты в Котлине
Чтобы понять, какие сопутствующие объекты в Котлине есть, мы должны сначала понять, какие объявления объектов находятся в Котлине. Объявление объекта в Котлине — это способ, которым одиночный элемент создается в Котлине.
Синглтоны в Котлине так же просты, как объявление объекта и присвоение ему имени. Например:
Использование указанного выше объявления объекта:
Благодаря этому мы смогли создать поставщика, который предоставит нам экземпляр репозитория (который поможет нам подключиться к API Github через GithubApiService).
Объявление объекта инициализируется при первом доступе — так же, как работает Singleton.
Однако, объекты-компаньоны — это тип объявления объекта, который соответствует ключевому слову companion. Объекты Companion можно сравнить с статическими методами или полями на Java. Фактически, если вы ссылаетесь на объект-компаньон с Java, он будет выглядеть как статический метод или поле.
Сопутствующий объект — это то, что используется в версии GithubApiService.kt Kotlin выше.
4. Создание репозитория
Поскольку мы стараемся как можно больше абстрагировать наши процессы, мы можем создать простой репозиторий, который обрабатывает вызов GithubApiService и строит строку запроса.
Строка запроса, соответствующая нашей спецификации для этого демонстрационного приложения (для поиска разработчиков Java в Омске) с использованием API Github, — это местоположение: Omsk + language: Java, поэтому мы создадим метод в репозитории, который позволит нам построить эту строку, передавая местоположение и язык в качестве параметров.
Наш поисковый репозиторий будет выглядеть так:
Строковые шаблоны в Котлине
В блоке вышеприведенного кода мы использовали функцию Kotlin, называемую «String templates», чтобы построить нашу строку запроса. Строковые шаблоны начинаются со знака доллара — $ и значение переменной, следующей за ней, конкатенируется с остальной частью строки. Это аналогичная функция для строковой интерполяции в groovy.
5. Делаем запрос и получаем ответ API при помощи RxJava
Теперь, когда мы настроили наши классы ответов, наш интерфейс репозитория, теперь мы можем сделать запрос и получить ответ API с помощью RxJava. Этот шаг похож на то, как мы будем делать это на Java. В коде Kotlin это выглядит так:
Мы сделали наш запрос и получили ответ. Теперь можем делать с ним все, что захотим.
Полезные ссылки:
Заключение
Таким образом, в этом посте мы рассмотрели некоторые интересные возможности/свойства языка Kotlin и способы их применения при использовании Retrofit + RxJava для сетевых вызовов.
- Классы данных
- Объявления объектов
- Сопутствующие объекты
- Строковые шаблоны
- Взаимодействие с Java
Источник
Retrofit with Kotlin-Android
In this tutorial we will learn how to implement Retrofit HTTP client in Android with Kotlin.
Retrofit is a powerful HTTP client for an Android and Java built by awesome folks at Square . Retrofit Configured with convertors makes it easy to serialize structured data sets. Typically for JSON we uses Gson convertors to serialization and De-serialization process.
Retrofit uses the Okhttp library for for HTTP requests.
Please find the sample project given below.
- Open your project and add dependencies into app level build.gradle ( Module:app) file. Here we adds Gson,RecyclerView,CardView,Piccasso and Retrofit libraries
- Make sure you have added the INTERNET permission in AndroidManifest.xml file like this.
- Next we need to create data model to parse our sample Json response . The sample response is given below.
Sample response
- Now Create a Kotlin Class named DataModel.kt under model package like shown below.
DataModel.kt
- Now create a retrofit instance to make a network request to a REST API with Retrofit.
- Here we creates a Kotlin object ApiClient.kt under retrofit package.
- The BASE_URL is the basic URL of your API where we will make a call
ApiClient.kt
- Define End Points : Now we create an interface ApiInterface.kt under retrofit package to define the api end points
ApiInterface.kt
- Set up MainActivityClass
- Now we are all set to make an api call in MainActivity.kt .
- getData() method is used to make HTTP request using Retrofit
- Here we fetch data and populate it in to a RecyclerView , the RecyclerViewAdapter DataAdapter and RecyclerView layouts are described later.
activity_main.xml
MainActivity.kt
- Set up RecyclerView
- To set up RecyclerView we need a list layout and RecyclerView.Adapter DataAdapter.kt as given below.
- The layout includes only a text view to show the title.
list_item_home.xml
DataAdapter.kt
Now we are all done. We have learned how to implement Retrofit with Kotlin and Implantation of RecyclerView . You can also find the Source Code of the project from GitHub .
Источник