Избранное сообщение

Фетісов В. С. Комп’ютерні технології в тестуванні. Навчально-методичний посібник. 2-ге видання, перероблене та доповнене / Мои публикации

В 10-х годах я принимал участие в программе Европейского Союза Tempus "Освітні вимірювання, адаптовані до стандартів ЄС". В рамк...

Благодаря Интернету количество писателей и поэтов увеличивается в геометрической прогрессии. Поголовье читателей начинает заметно отставать.

пятница, 26 октября 2018 г.

Android LiveData на Kotlin с использованием Retrofit и coroutines / Android. Разработка приложений

Статья рассказывает об использовании Android Components ViewModel, LifeCycle и LiveData. Эти компоненты позволяют не заботиться о жизненном цикле Activity.

Так же рассмотрен пример применения современного 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/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/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/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

Комментариев нет:

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