При стабилизации компонентов Android Architecture я начал обновлять все основные базовые ViewModel
до новой реализации ViewModel
. По моему мнению, использование LiveData
рекомендуется удерживать класс Model
, поскольку он лучше справляется с жизненным циклом.
Мне нравится использовать Data Binding
, потому что он делает код более четким в Java/Kotlin, и нет необходимости "смотреть" изменения значений для обновления пользовательского интерфейса. Однако макет с использованием Data Binding
отслеживает только изменения данных, если Model
(или ViewModel) расширяет BaseObservable
и LiveData
не делает, Я понимаю, что одна из основных целей LiveData
должна соблюдаться и обновлять пользовательский интерфейс программно, но для простых обновлений Data Binding
очень полезен.
Эта проблема уже сообщалась (GitHub и Переполнение стека) и сначала было сказано, что версия 1.0 будет иметь его, и теперь говорят, что эта функция находится в разработке.
Чтобы использовать как LiveData
, так и Data Binding
, я создал очень простую реализацию класса, которая расширяет BaseObservable
:
import android.arch.lifecycle.LiveData
import android.arch.lifecycle.MutableLiveData
import android.databinding.BaseObservable
class ObservableMutableLiveData<T>() : BaseObservable() {
private var data: MutableLiveData<T> = MutableLiveData()
constructor(data: T) : this() {
this.data.value = data
}
public fun set(value: T) {
if (value != data.value) {
data.value = value
notifyChange()
}
}
public fun get(): T? {
return data.value
}
public fun getObservable(): LiveData<T> {
return data
}
}
Итак, в основном мой ObservableMutableLiveData
является копией ObservableField
с помощью LiveData
для хранения модели и с этой реализацией макет обновления после каждого обновления модели.
Вопросы:
- Это плохая реализация
LiveData
? Разве эта оболочка "ломает" функциональные возможностиLiveData
, например, с учетом жизненного цикла? - В моем понимании
LiveData
- это новыйObservableField
. Правильно ли это?