Используйте LiveData без Lifecycle Owner

Я не смог найти никакой информации, если использовать 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
    }
}

Конечно, вы можете это сделать, но если ваш держатель элемента привязан к чему-то с жизненным циклом, это, вероятно, плохая идея, потому что вы можете получать обновления, когда ваш объект жизненного цикла не находится в запущенном состоянии. Если это не проблема, хорошо. То, что у вас есть, похоже на rx Java и ручную подписку и отказ от подписки на наблюдаемый.

AutonomousApps 30.04.2018 17:45

Согласовано. Используйте LiveData с активностями / фрагментами. Используйте RxJava для вещей, не связанных с пользовательским интерфейсом.

CommonsWare 30.04.2018 17:54
10
2
5 482
3

Ответы 3

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

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

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

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

Вы можете зарегистрировать наблюдателя без связанного объекта LifecycleOwner с помощью метода observeForever(Observer). В этом случае наблюдатель считается всегда активным и поэтому всегда уведомляется об изменениях. Вы можете удалить этих наблюдателей, вызвав метод removeObserver(Observer).

Ссылкаhttps://developer.android.com/topic/libraries/architecture/livedata.html#work_livedata

Вы можете зарегистрировать наблюдателя без связанного объекта LifecycleOwner, используя

observeForever(Observer) method

как это:

 orderRepo.getServices().observeForever(new Observer<List<Order>>() {
            @Override
            public void onChanged(List<Order> orders) {
               //
            }
        });

Другие вопросы по теме