试图找出Google最近的工具和概念: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
的更改,这只是{{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
问题:
..
class BarObserver : Observer<List<String>> {
override fun onChanged(p0: List<String>?) {
Log.d("Say", "changed:")
}
}
barObserver = BarObserver()
..
Observers
从未触发?onChange
而不是LifeCycleOwner``getLifecycle
? 修改 正如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
}
答案 0 :(得分:1)
如果您没有扩展LifecycleActivity,那么您的活动应该实现LifecycleRegistryOwner而不是LifecycleObserver。查看docs。
然后你可以将它传递给liveData.observe(lifecycleOwner,observer)