Live data android что это

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 или ниже в этой статье.

Источник

Изучаем LiveData в Android: postValue или setValue?

Разработчикам Android часто приходится иметь дело с различными данными. Данные с одного экрана могут использоваться на другом. А ещё можно поменять внешний вид экрана, если данные обновились. Основная задача состоит в том, чтобы наладить эффективное взаимодействие между экраном и источником данных. Лучший способ это сделать — использовать LiveData, которая является частью Android Jetpack.

Чаще всего в LiveData используют методы setValue и postValue. Если судить по названию, кажется, что они выполняют одинаковую работу. Но на самом деле это не так.

Давайте разбираться, в чём разница.

Что такое LiveData?

Согласно документации, LiveData — это класс, который содержит данные и за поведением которого можно наблюдать (observable). В отличие от классического observable, LiveData знает о жизненном цикле активити, фрагмента, сервиса и других компонентов Android, связанных с циклом.

Если говорить простыми словами, LiveData — это контейнер, который следит за жизненным циклом экрана и снабжает его данными, когда это уместно. Например, если активити находится на переднем плане и видна пользователю. Ценность такого подхода заключается в том, что LiveData не будет снабжать ваш экран данными, если он свёрнут или закрыт. Но как только экран появится перед пользователем, обновление данных возобновится.

Это даёт LiveData несколько преимуществ:

  • нет утечек памяти;
  • экран всегда содержит актуальные данные;
  • никаких крашей из-за обновления данных, если активити закрывается.

Разница между setValue и postValue

Разберём на примере, зачем нужны такие похожие методы. Предположим, вам нужно обновить данные на экране с помощью LiveData. Вы можете сделать это в основном потоке приложения (Main thread) или в отдельном. При обновлении в основном потоке вы используете setValue у класса MutableLiveData. А при обновлении данных для основного потока из фонового нужно использовать метод postValue. Это значит, что метод setValue уместен в основном потоке приложения, а postValue — если данные приходят из фонового потока.

Читайте также:  Meizu android не включается

Вот чек-лист, чтобы не запутаться, когда какой метод нужен:

  • Если вы выполняете работу в основном потоке, то setValue и postValue будут работать одинаково.
  • Если вы выполняете работу в фоновом потоке, то можете использовать только postValue. Дело в том, что данные в LiveData изменятся сразу, а вот их обновление в основном потоке будет происходить асинхронно при помощи Handler.

В коде это будет выглядеть так:

Здесь для разных потоков используются разные методы. Метод setValue вызывается два раза. Это значит, что экран обновится дважды, потому что код выполняется в основном потоке приложения. Метод postValue выполняется асинхронно, поэтому обновление экрана будет зависеть от работы основного потока.

Иногда во время вызова метода liveData.postValue(«someNewData») экран ещё не открыт или приложение свёрнуто. А во время выполнения метода liveData.postValue(«againNewData») экран уже виден пользователю. Это значит, что на экране отобразятся только последние данные «againNewData» .

При использовании postValue будьте внимательны. Если на эту LiveData никто не был подписан во время обновления данных, то вызов getValue их вам не вернёт.

Надеемся, что эта статья помогла вам узнать немного больше об использовании LiveData, особенно в контексте асинхронной работы, которой так много в разработке под Android.

Разработчикам Android часто приходится иметь дело с различными данными. Данные с одного экрана могут использоваться на другом. А ещё можно поменять внешний вид экрана, если данные обновились. Основная задача состоит в том, чтобы наладить эффективное взаимодействие между экраном и источником данных. Лучший способ это сделать — использовать LiveData, которая является частью Android Jetpack.

Чаще всего в LiveData используют методы setValue и postValue. Если судить по названию, кажется, что они выполняют одинаковую работу. Но на самом деле это не так.

Давайте разбираться, в чём разница.

Что такое LiveData?

Согласно документации, LiveData — это класс, который содержит данные и за поведением которого можно наблюдать (observable). В отличие от классического observable, LiveData знает о жизненном цикле активити, фрагмента, сервиса и других компонентов Android, связанных с циклом.

Если говорить простыми словами, LiveData — это контейнер, который следит за жизненным циклом экрана и снабжает его данными, когда это уместно. Например, если активити находится на переднем плане и видна пользователю. Ценность такого подхода заключается в том, что LiveData не будет снабжать ваш экран данными, если он свёрнут или закрыт. Но как только экран появится перед пользователем, обновление данных возобновится.

Это даёт LiveData несколько преимуществ:

  • нет утечек памяти;
  • экран всегда содержит актуальные данные;
  • никаких крашей из-за обновления данных, если активити закрывается.

Разница между setValue и postValue

Разберём на примере, зачем нужны такие похожие методы. Предположим, вам нужно обновить данные на экране с помощью LiveData. Вы можете сделать это в основном потоке приложения (Main thread) или в отдельном. При обновлении в основном потоке вы используете setValue у класса MutableLiveData. А при обновлении данных для основного потока из фонового нужно использовать метод postValue. Это значит, что метод setValue уместен в основном потоке приложения, а postValue — если данные приходят из фонового потока.

Читайте также:  Андроид установка обои экран блокировки

Вот чек-лист, чтобы не запутаться, когда какой метод нужен:

  • Если вы выполняете работу в основном потоке, то setValue и postValue будут работать одинаково.
  • Если вы выполняете работу в фоновом потоке, то можете использовать только postValue. Дело в том, что данные в LiveData изменятся сразу, а вот их обновление в основном потоке будет происходить асинхронно при помощи Handler.

В коде это будет выглядеть так:

Здесь для разных потоков используются разные методы. Метод setValue вызывается два раза. Это значит, что экран обновится дважды, потому что код выполняется в основном потоке приложения. Метод postValue выполняется асинхронно, поэтому обновление экрана будет зависеть от работы основного потока.

Иногда во время вызова метода liveData.postValue(«someNewData») экран ещё не открыт или приложение свёрнуто. А во время выполнения метода liveData.postValue(«againNewData») экран уже виден пользователю. Это значит, что на экране отобразятся только последние данные «againNewData» .

При использовании postValue будьте внимательны. Если на эту LiveData никто не был подписан во время обновления данных, то вызов getValue их вам не вернёт.

Надеемся, что эта статья помогла вам узнать немного больше об использовании LiveData, особенно в контексте асинхронной работы, которой так много в разработке под Android.

Источник

Урок 2. LiveData

В этом уроке рассмотрим основные возможности LiveData. Как подписаться на его данные. Как помещать в него данные. Как он взаимодействует со своими подписчиками.

Полный список уроков курса:

Подключение библиотеки

В build.gradle файл проекта добавьте репозитарий google()

В build.gradle файле модуля добавьте dependencies:

Если у вас студия ниже 3.0 и старые версии Gradle и Android Plugin, то подключение будет выглядеть так:

Иногда может возникнуть конфликт с support library. Будет выдавать такую ошибку: Error:Program type already present: android.arch.lifecycle.LiveData

В таком случае попробуйте указать последние версии двух этих библиотек.

Теория

LiveData — хранилище данных, работающее по принципу паттерна Observer (наблюдатель). Это хранилище умеет делать две вещи:

1) В него можно поместить какой-либо объект

2) На него можно подписаться и получать объекты, которые в него помещают.

Т.е. с одной стороны кто-то помещает объект в хранилище, а с другой стороны кто-то подписывается и получает этот объект.

В качестве аналогии можно привести, например, каналы в Telegram. Автор пишет пост и отправляет его в канал, а все подписчики получают этот пост.

Если вы знакомы с RxJava, то LiveData напомнит вам BehaviourSubject. Методом onNext вы передаете ему данные, а он передает эти данные своим подписчикам. Плюс, все новые подписчики сразу получают последнее значение.

Казалось бы, ничего особо в таком хранилище нет, но есть один очень важный нюанс. LiveData умеет определять активен подписчик или нет, и отправлять данные будет только активным подписчикам. Предполагается, что подписчиками LiveData будут Activity и фрагменты. А их состояние активности будет определяться с помощью их Lifecycle объекта, который мы рассмотрели в прошлом уроке.

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

Давайте рассмотрим пример.

Пусть у нас есть некий синглтон класс DataController из которого можно получить LiveData .

DataController периодически что-то там внутри себя делает и обновляет данные в LiveData. Как он это делает, мы посмотрим чуть позже. Сначала посмотрим, как Activity может подписаться на LiveData и получать данные, которые помещает в него DataController.

Читайте также:  Рыжий том для android

Код в Activity будет выглядеть так:

Получаем LiveData из DataController, и методом )» target=»_blank» rel=»noopener noreferrer»>observe подписываемся. В метод observe нам необходимо передать два параметра:

Первый — это LifecycleOwner. Напомню, что LifecycleOwner — это интерфейс с методом getLifecycle. Activity и фрагменты в Support Library, начиная с версии 26.1.0 реализуют этот интерфейс, поэтому мы передаем this.

LiveData получит из Activity его Lifecycle и по нему будет определять состояние Activity. Активным считается состояние STARTED или RESUMED. Т.е. если Activity видно на экране, то LiveData считает его активным и будет отправлять данные в его колбэк.

Если предыдущие два абзаца состоят из кучи незнакомых для вас слов, то посмотрите Урок 1. Lifecycle. Там мы подробно разобрали объект Lifecycle и его состояния.

Второй параметр — это непосредственно подписчик, т.е. колбэк, в который LiveData будет отправлять данные. В нем только один метод onChanged. В нашем примере туда будет приходить String.

Теперь, когда DataController поместит какой-либо String объект в LiveData, мы сразу получим этот объект в Activity, если Activity находится в состоянии STARTED или RESUMED.

Нюансы поведения

Распишу сразу несколько важных моментов в поведении LifeData.

Если Activity было не активно во время обновления данных в LiveData, то при возврате в активное состояние, его observer получит последнее актуальное значение данных.

В момент подписки, observer получит последнее актуальное значение из LiveData.

Если Activity будет закрыто, т.е. перейдет в статус DESTROYED, то LiveData автоматически отпишет от себя его observer.

Если Activity в состоянии DESTROYED попробует подписаться, то подписка не будет выполнена.

Если Activity уже подписывало свой observer, и попробует сделать это еще раз, то просто ничего не произойдет.

Вы всегда можете получить последнее значение LiveData с помощью его метода getValue.

Как видите, подписывать Activity на LiveData — это удобно. Поворот экрана и полное закрытие Activity — все это корректно и удобно обрабатывается автоматически без каких-либо усилий с нашей стороны.

Отправка данных в LiveData

Мы разобрались, как получать данные из LiveData, и каким образом при этом учитывается состояние Activity. Теперь давайте посмотрим с другой стороны — как передавать данные в LiveData.

В классе DataController переменная LiveData будет выглядеть так:

Наружу мы передаем LiveData, который позволит внешним объектам только получать данные. Но внутри DataController мы используем объект MutableLiveData, который позволяет помещать в него данные.

Чтобы поместить значение в MutableLiveData, используется метод setValue:

Этот метод обновит значение LiveData, и все его активные подписчики получат это обновление.

Метод setValue должен быть вызван из UI потока. Для обновления данных из других потоков используйте метод postValue. Он перенаправит вызов в UI поток. Соответственно, подписчики всегда будут получать значения в основном потоке.

Чуть более подробный пример с LiveData мы рассмотрим в Уроке 4, когда будем изучать ViewModel.

Присоединяйтесь к нам в Telegram:

— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Источник

Оцените статью