Как поделиться экземпляром LiveData в приложении для Android? - PullRequest
1 голос
/ 10 июня 2019

Простой вариант использования

Я использую MVVM архитектура и Компоненты архитектуры Android в моем приложении.

После того, как пользователь войдет в систему, я получаю несколько сетевых данных и хочу получить доступ к ним из разных ViewModels , подключенных к различным Деятельностям жизненного цикла.

Я не хочу использовать Room Persistence Library в моем приложении.

Я видел некоторые вопросы о совместном использовании ViewModel между Деятельностями или об использовании LiveData в качестве статического члена, но я думаю, что в большинстве случаев нам нужно доступ к одним и тем же данным на нескольких экранах.

Я хочу поделиться решением, но если есть лучшее или есть проблема с этим, пожалуйста, оставьте свои мысли.

1 Ответ

0 голосов
/ 10 июня 2019

Идея состоит в том, чтобы иметь Singleton Репозиторий , который разделяет LiveData между потребителями ( ViewModels ).

class SharedLiveDataRepository(val dataSource: MyDataSource) {

    // This LiveData is shared across consumers
    private val result = MutableLiveData<Long>()

    fun loadData(): LiveData<Long> {
        if (result.value == null) {
            result.value = dataSource.getData()
        }
        return result
    }

}

Если по какой-то причине вы хотите обновить данные, метод loadItem может выглядеть следующим образом

  fun loadData(refresh: Boolean = false): LiveData<Long> {
        if (refresh == true) {
            result.value = null
        } 
        if (result.value == null) {
            result.value = dataSource.getData()
        }
        return result
    }

Обратите внимание: Для обновления данных этовозможно увидеть сбой.

Представьте себе сценарий, когда происходит переход между двумя действиями, и первое наблюдает за LiveData, а второе начинает обновлять его.

Я думаю, что решение для вышеупомянутогопроблема заключается в том, чтобы выполнить обновление в первом действии, а затем перейти к следующему.

...