AppCompatActivity, ViewModel и привязка данных

Попытка выяснить последние инструменты и концепции Google: LifecycleActivity , ViewModel и привязка данных .

Представьте себе, что существует FooActivity который расширяет AppCompatActivity (чтобы иметь возможность использовать библиотеку поддержки) и реализует интерфейс LifecycleOwner (из ссылки: требуется для использования LiveData):

FooActivity.kt:

 class FooActivity: AppCompatActivity(), LifecycleObserver { ... 

Мы установили привязку:

  .. private val mBinding: by lazy { DataBindingUtil.setContentView<ActivityFooBinding>(this, R.layout.activity_foo) } .. 

Мы устанавливаем активность ViewModel и присоединяем наш barObserver (который должен наблюдать изменения в bar внутри ViewModel , который является просто List Strings ):

  .. val viewModel = ViewModelProviders.of(this).get(FooViewModel::class.java) viewModel.getBars()?.observe(this, barObserver) viewModel.init() // changes bar, should trigger Observer's onChanged .. 

И, наконец, мы определяем barObserver :

  .. class BarObserver : Observer<List<String>> { override fun onChanged(p0: List<String>?) { Log.d("Say", "changed:") } } barObserver = BarObserver() .. 

Вопросов:

  1. Почему Observers onChange никогда не срабатывали?
  2. Следует ли использовать LifeCycleOwner``getLifecycle вместо использования Observer ?
  3. Любые другие мысли?

Изменить: поскольку эталонное состояние :

LiveData – это класс держателя данных, который можно наблюдать в течение заданного жизненного цикла. Это означает, что Observer можно добавить в пару с LifecycleOwner, и этот наблюдатель будет уведомлен об изменениях обернутых данных только в том случае, если спаренный LifecycleOwner находится в активном состоянии. LifecycleOwner считается активным, если его состояние запущено или возобновлено. Наблюдатель, добавленный через watchForever (Observer), считается всегда активным и поэтому всегда будет уведомлен об изменениях. Для этих наблюдателей вы должны вручную вызвать removeObserver (Observer).

Изменение:

enter code here viewModel.getBars () ?. наблюдать (это, barObserver)

чтобы:

viewModel.getBars()?.observeForever(barObserver)

не сделал этого. onChange все равно никогда не срабатывает.

Edit2:

FooActivity.kt :

заменены на:

 class FooActivity: AppCompatActivity(), LifecycleRegistryOwner{ override fun getLifecycle(): LifecycleRegistry { var lifecycle = LifecycleRegistry(this) lifecycle.addObserver(barObserver) return lifecycle } 

FooViewModel :

  .. private var mBar = MutableLiveData<List<String>>() .. mBar.value = listValueOf("1", "2", "3") .. fun getBar(): LiveData<List<String>>? = mBar .. 

Если вы не распространяете LifecycleActivity, тогда ваша активность должна реализовывать LifecycleRegistryOwner вместо LifecycleObserver. Проверьте документы .

И тогда вы можете передать его в liveData.observe (lifecycleOwner, observer)