0

试图弄清楚谷歌最近的工具和概念:LifecycleActivityViewModelData Binding

所以想象有一个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,这只是一个ListStrings

  ..
  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 是一个可以在给定生命周期内观察到的数据持有者类。这意味着观察者可以与 LifecycleOwner 成对添加,并且只有当配对的 LifecycleOwner 处于活动状态时,才会通知该观察者包装数据的修改。如果 LifecycleOwner 的状态为 STARTED 或 RESUMED,则认为 LifecycleOwner 处于活动状态。通过 observeForever(Observer) 添加的观察者被视为始终处于活动状态,因此将始终收到有关修改的通知。对于那些观察者,您应该手动调用 removeObserver(Observer)。

改变:

enter code hereviewModel.getBars()?.observe(this, barObserver)

到:

viewModel.getBars()?.observeForever(barObserver)

没有把戏。onChange仍然没有触发。

编辑2:

FooActivity.kt

替换为:

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

FooView 模型

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

1 回答 1

1

如果您没有扩展 LifecycleActivity,那么您的活动应该实现 LifecycleRegistryOwner 而不是 LifecycleObserver。查看文档

然后你可以将它传递给 liveData.observe(lifecycleOwner, observer)

于 2017-06-11T07:13:07.320 回答