Статья рассказывает об использовании Android Components ViewModel, LifeCycle и LiveData. Эти компоненты позволяют не заботиться о жизненном цикле Activity.
Так же рассмотрен пример применения современного Coroutines в связке с репозитарием на Retrofit
Retrofit coroutines extension
kotlin-coroutines-retrofit
Расширение для Retrofit на Kotlin. Это всего два файла. Я просто добавил их в проект. Вы можете подключить их через Dependency в Gradle. На Github есть примеры использования.
Также подключаем Adapter addCallAdapterFactory(CoroutineCallAdapterFactory()).
ServerAPI и Repository находятся в одном файле
REST API
Реализацией REST API на Kotlin. Она не имеет каких либо специфичных изменений
LiveData
Далее рассмотрим Repository. Это основной сервис получения LiveData. Инициализируем LiveData состоянием загрузки: Resource.loading(null). Далее ожидаем окончание запроса awaitResult() Этот вызов должен быть в блоке Coroutin async(UI)
По окончанию запроса мы можем хэндлить результат. Если все хорошо результат будет сохранен в mutableLiveData.value = Resource.success(result.value) Важный момент — это должена быть ссылка на новый экземпляр, иначе observer LiveData не отработает. see: new Resource<>(SUCCESS, data, null);
Wrapper data
Для обработки ошибок и передачи состояния в Fragment используется Wrapper — Resource<T>.
Он хранить три состояния:
Cами данные:
ViewModel
StoresViewModel запрашивает данные у репозитория и сохраняет во внутренней переменной stores
ViewModelProviders
Для передачи параметров в ViewModel расширим стандартную ViewModelProviders
Например для передачи в LoginViewModel надо два параметра (Login,Password). Для передачи токена в StoresViewModel используется один (Token)
Fragment
Получение StoresViewModel:
Использование наблюдателя Observer за изменением данных:
P.S.
Для хранения Token и использования его во всем приложении я применил библиотеку/расширение от Fabio Collini. Применение хорошо описано в его статье. Ссылка есть на странице в Github или ниже в этой статье.
prefs-delegates by Fabio Collini
Gradle
Links
Все в одном примере
Android Architecture Components samples
LiveData Overview
Async code using Kotlin Coroutines
Multithreading and Kotlin
Так же рассмотрен пример применения современного Coroutines в связке с репозитарием на Retrofit
fun main(args: Array<String>): Unit = runBlocking {
// Wait (suspend) for Result
val result: Result<User> = api.getUser("username").awaitResult()
// Check result type
when (result) {
//Successful HTTP result
is Result.Ok -> saveToDb(result.value)
// Any HTTP error
is Result.Error -> log("HTTP error with code ${result.error.code()}", result.error)
// Exception while request invocation
is Result.Exception -> log("Something broken", e)
}
}
Retrofit coroutines extension
kotlin-coroutines-retrofit
Расширение для Retrofit на Kotlin. Это всего два файла. Я просто добавил их в проект. Вы можете подключить их через Dependency в Gradle. На Github есть примеры использования.
Также подключаем Adapter addCallAdapterFactory(CoroutineCallAdapterFactory()).
ServerAPI и Repository находятся в одном файле
REST API
Реализацией REST API на Kotlin. Она не имеет каких либо специфичных изменений
LiveData
Далее рассмотрим Repository. Это основной сервис получения LiveData. Инициализируем LiveData состоянием загрузки: Resource.loading(null). Далее ожидаем окончание запроса awaitResult() Этот вызов должен быть в блоке Coroutin async(UI)
По окончанию запроса мы можем хэндлить результат. Если все хорошо результат будет сохранен в mutableLiveData.value = Resource.success(result.value) Важный момент — это должена быть ссылка на новый экземпляр, иначе observer LiveData не отработает. see: new Resource<>(SUCCESS, data, null);
Wrapper data
Для обработки ошибок и передачи состояния в Fragment используется Wrapper — Resource<T>.
Он хранить три состояния:
public enum Status { SUCCESS, ERROR, LOADING }
Cами данные:
@Nullable public final T data;
ViewModel
StoresViewModel запрашивает данные у репозитория и сохраняет во внутренней переменной stores
val api = Repository()
stores = api.getStores(token)
ViewModelProviders
Для передачи параметров в ViewModel расширим стандартную ViewModelProviders
Например для передачи в LoginViewModel надо два параметра (Login,Password). Для передачи токена в StoresViewModel используется один (Token)
Fragment
Получение StoresViewModel:
viewModel = ViewModelProviders.of(this, AppViewModelFactory(requireActivity(), tokenHolder.token)).get(StoresViewModel::class.java)
Использование наблюдателя Observer за изменением данных:
// Observe data on the ViewModel, exposed as a LiveData
viewModel.stores.observe(this, Observer<Resource<Array<Store>>> { storesResource ->
P.S.
Для хранения Token и использования его во всем приложении я применил библиотеку/расширение от Fabio Collini. Применение хорошо описано в его статье. Ссылка есть на странице в Github или ниже в этой статье.
prefs-delegates by Fabio Collini
class TokenHolder(prefs: SharedPreferences) {
var token by prefs.string()
private set
var count by prefs.int()
private set
fun saveToken(newToken: String) {
token = newToken
count++
}
}
Gradle
implementation 'android.arch.lifecycle:extensions:1.1.1'
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:0.30.0"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:0.30.0"
implementation "com.squareup.retrofit2:retrofit:2.4.0"
implementation "com.squareup.retrofit2:converter-gson:2.4.0"
implementation "com.jakewharton.retrofit:retrofit2-kotlin-coroutines-experimental-adapter:1.0.0"
// If you use Kotlin 1.2 or 1.3
// compile 'ru.gildor.coroutines:kotlin-coroutines-retrofit:0.13.0'
// compile 'ru.gildor.coroutines:kotlin-coroutines-retrofit:0.13.0-eap13'
Links
Все в одном примере
Android Architecture Components samples
LiveData Overview
Async code using Kotlin Coroutines
Multithreading and Kotlin
Источник: https://habr.com/post/427475/?utm_source=habrahabr&utm_medium=rss&utm_campaign=427475
Смотри также:
Учимся программировать под Андроид. http://fetisovvs.blogspot.com/2017/08/android.html
Новости Android-разработки, на которые стоит подписаться. http://fetisovvs.blogspot.com/2018/02/android-android.html
Новости Android-разработки, на которые стоит подписаться. http://fetisovvs.blogspot.com/2018/02/android-android.html
Советы по созданию современного Android-приложения. Лекция Яндекса. http://fetisovvs.blogspot.com/2017/12/android-android.html
Несколько книг для начинающего и продолжающего разработчика под Android. http://fetisovvs.blogspot.com/2018/01/android-android.html
Модульная разработка Android приложений. http://fetisovvs.blogspot.com/2018/04/android-android_21.html
8 учебных проектов. http://fetisovvs.blogspot.com/2017/12/8-android.html
Советы по чистому коду новичкам в Java/Android. http://fetisovvs.blogspot.com/2017/12/javaandroid-android.html
Файловые системы Android | Losst. http://fetisovvs.blogspot.com/2017/12/android-losst-android.html
Android и архитектура. http://fetisovvs.blogspot.nl/2017/05/android-android_20.html
Новая архитектура Android-приложений — пробуем на практике. http://fetisovvs.blogspot.nl/2017/06/android-android.html
Шпаргалка по тестированию требований к мобильным приложениям. http://fetisovvs.blogspot.com/2017/09/android_6.html
Обновление строк на лету в мобильных приложениях: часть 1. http://fetisovvs.blogspot.com/2018/01/1-android.html
https://fetisovvs.blogspot.com/2018/10/android-android_13.htmlНемного о быстрой работе со списками.
Как Android запускает MainActivity. http://fetisovvs.blogspot.com/2017/12/android-mainactivity-android.html
Для чего нужен Android-эмулятор BlueStacks. http://fetisovvs.blogspot.com/2016/11/android-bluestacks-android.html
Теория по Service в Android. http://fetisovvs.blogspot.com/2017/09/service-android-android.html
Пример использования ScrollView в Android. http://fetisovvs.blogspot.com/2016/09/scrollview-android-android.html
Пример использования ViewFlipper в Android. Обзор контейнера ViewFlipper. http://fetisovvs.blogspot.com/2016/09/viewflipper-android-viewflipper-java.html
Remix OS Player – новый эмулатор Android для Windows. http://fetisovvs.blogspot.com/2016/09/remix-os-player-android-windows-android.html
Руководство по фоновой работе в Android. Часть 1. http://fetisovvs.blogspot.com/2018/02/android-1-android.html
Несколько книг для начинающего и продолжающего разработчика под Android. http://fetisovvs.blogspot.com/2018/01/android-android.html
Модульная разработка Android приложений. http://fetisovvs.blogspot.com/2018/04/android-android_21.html
8 учебных проектов. http://fetisovvs.blogspot.com/2017/12/8-android.html
Советы по чистому коду новичкам в Java/Android. http://fetisovvs.blogspot.com/2017/12/javaandroid-android.html
Файловые системы Android | Losst. http://fetisovvs.blogspot.com/2017/12/android-losst-android.html
Android и архитектура. http://fetisovvs.blogspot.nl/2017/05/android-android_20.html
Новая архитектура Android-приложений — пробуем на практике. http://fetisovvs.blogspot.nl/2017/06/android-android.html
Шпаргалка по тестированию требований к мобильным приложениям. http://fetisovvs.blogspot.com/2017/09/android_6.html
Обновление строк на лету в мобильных приложениях: часть 1. http://fetisovvs.blogspot.com/2018/01/1-android.html
https://fetisovvs.blogspot.com/2018/10/android-android_13.htmlНемного о быстрой работе со списками.
Как Android запускает MainActivity. http://fetisovvs.blogspot.com/2017/12/android-mainactivity-android.html
Для чего нужен Android-эмулятор BlueStacks. http://fetisovvs.blogspot.com/2016/11/android-bluestacks-android.html
Теория по Service в Android. http://fetisovvs.blogspot.com/2017/09/service-android-android.html
Пример использования ScrollView в Android. http://fetisovvs.blogspot.com/2016/09/scrollview-android-android.html
Пример использования ViewFlipper в Android. Обзор контейнера ViewFlipper. http://fetisovvs.blogspot.com/2016/09/viewflipper-android-viewflipper-java.html
Remix OS Player – новый эмулатор Android для Windows. http://fetisovvs.blogspot.com/2016/09/remix-os-player-android-windows-android.html
Руководство по фоновой работе в Android. Часть 1. http://fetisovvs.blogspot.com/2018/02/android-1-android.html
Анимации в Android по полочкам. http://fetisovvs.blogspot.com/2018/02/android-3-android.html
Стабилизация экрана в Android. http://fetisovvs.blogspot.com/2016/12/android-android.html
Android и звук: как делать правильно. http://fetisovvs.blogspot.com/2017/10/android-android.html
Разработан инструмент для проверки Android-приложений на уязвимости. http://fetisovvs.blogspot.com/2018/02/android-android_16.html
Android и звук: как делать правильно. http://fetisovvs.blogspot.com/2017/10/android-android.html
Разработан инструмент для проверки Android-приложений на уязвимости. http://fetisovvs.blogspot.com/2018/02/android-android_16.html
Интеграция Android-приложения с фискальным принтером и кардридером. http://fetisovvs.blogspot.com/2017/04/android-android.html
Создание простейшей 2D игры на андроид. http://fetisovvs.blogspot.com/2017/06/2d-android.html
Как я создала прибыльное Android приложение по распознаванию текста. http://fetisovvs.blogspot.com/2018/09/android-android_5.htmlСоздание простейшей 2D игры на андроид. http://fetisovvs.blogspot.com/2017/06/2d-android.html
Комментариев нет:
Отправить комментарий