AppCompatActivity,ViewModel和数据绑定

时间:2017-06-11 07:00:49

标签: android kotlin android-databinding android-architecture-components

试图找出Google最近的工具和概念: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的更改,这只是{{1} } 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

问题:

  1. 为什么 .. class BarObserver : Observer<List<String>> { override fun onChanged(p0: List<String>?) { Log.d("Say", "changed:") } } barObserver = BarObserver() .. Observers从未触发?
  2. 是否应该使用onChange而不是LifeCycleOwner``getLifecycle
  3. 还有其他想法吗?
  4. 修改 正如reference states

      

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

    更改:

    Observer viewModel.getBars()?. observe(this,barObserver)

    为:

    enter code here

    没有诀窍。 viewModel.getBars()?.observeForever(barObserver)仍未触发过。

    EDIT2:

    FooActivity.kt

    替换为:

    onChange

    FooViewModel

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

1 个答案:

答案 0 :(得分:1)

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

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