试图弄清楚谷歌最近的工具和概念:LifecycleActivity、ViewModel和Data 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
,这只是一个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()
..
问题:
- 为什么
Observers
onChange
从来不触发? - 应该使用
LifeCycleOwner``getLifecycle
而不是使用Observer
吗? - 还有其他想法吗?
编辑: 作为参考状态:
LiveData 是一个可以在给定生命周期内观察到的数据持有者类。这意味着观察者可以与 LifecycleOwner 成对添加,并且只有当配对的 LifecycleOwner 处于活动状态时,才会通知该观察者包装数据的修改。如果 LifecycleOwner 的状态为 STARTED 或 RESUMED,则认为 LifecycleOwner 处于活动状态。通过 observeForever(Observer) 添加的观察者被视为始终处于活动状态,因此将始终收到有关修改的通知。对于那些观察者,您应该手动调用 removeObserver(Observer)。
改变:
enter code here
viewModel.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
..