Я не смог найти никакой информации, если использовать 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
}
}
Согласовано. Используйте LiveData с активностями / фрагментами. Используйте RxJava для вещей, не связанных с пользовательским интерфейсом.
Для меня LiveData имеет два преимущества:
Activity / Fragment).Как уже было сказано, если вы используете его вне компонентов жизненного цикла (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) {
//
}
});
Конечно, вы можете это сделать, но если ваш держатель элемента привязан к чему-то с жизненным циклом, это, вероятно, плохая идея, потому что вы можете получать обновления, когда ваш объект жизненного цикла не находится в запущенном состоянии. Если это не проблема, хорошо. То, что у вас есть, похоже на rx Java и ручную подписку и отказ от подписки на наблюдаемый.