Используйте LiveData без владельца жизненного цикла - PullRequest
0 голосов
/ 30 апреля 2018

Я не смог найти никакой информации, если это плохая идея использовать LiveData без владельца жизненного цикла. И если это так, что может быть альтернативой?

Позвольте привести простой пример

class Item() {
    private lateinit var property: MutableLiveData<Boolean>

    init {
        property.value = false
    }

    fun getProperty(): LiveData<Boolean> = property

    fun toggleProperty() {
        property.value = when (property.value) {
            false -> true
            else -> false
        }
    }
}

class ItemHolder {

    private val item = Item()

    private lateinit var observer: Observer<Boolean>

    fun init() {
        observer = Observer<Boolean> { item ->
            updateView(item)
        }
        item.getProperty().observeForever(observer)
    }

    fun destroy() {
        item.getProperty().removeObserver(observer)
    }

    fun clickOnButton() {
        item.toggleProperty();
    }

    private fun updateView(item: Boolean?) {
        // do something
    }
}

1 Ответ

0 голосов
/ 23 мая 2018

Для меня LiveData имеет два преимущества:

  1. Он знает о событиях жизненного цикла и будет доставлять обновления только в соответствующем состоянии подписчика (Activity / Fragment).
  2. Содержит последнее опубликованное значение и обновляет вместе с ним новых подписчиков.

Как уже было сказано, если вы используете его из компонентов жизненного цикла (Activity / Fragment) и доставленное обновление может быть выполнено в любое время, чем вы можете обойтись без держателя жизненного цикла, в противном случае, рано или поздно это может привести к сбою или потере данных.

В качестве альтернативы поведению LiveData я могу предложить BehaviourSubject из RxJava2 фреймворка, который действует почти так же, удерживая последнее обновленное значение и обновляя его новыми подписчиками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...