我正在通过udacy跟踪谷歌Android项目“猜猜看”,他们在那里引入了livedata和Mutablelivedata。我们已经到了这样一个地步,我们正在创建一个相当于Mutablelivedata对象的livedata,并为livedata创建一个get()Backing属性到Mutablelivedata实例。我们使用Mutablelivedata实例对视图模型中的数据进行所有更改。我们的用户界面片段将观察者设置在viewModel的livedata对象上,而不是Mutablelivedata对象上。
显示观察者在livedata实例而不是mutablelivedata实例上,当更新mutablelivedata对象时,会触发livedata观察者代码。我喜欢它这样工作,但我不太明白它是如何工作的。谁能给我解释一下吗?
在视图模型
val _word = MutableLiveData<String>()
val word : LiveData<String>
get() = _word
在ViewModel中编辑
private fun nextWord() {
//Select and remove a word from the list
if (wordList.isEmpty()) {
//gameFinished()
} else {
_word.value = wordList.removeAt(0)
}
}
在UI片段中
viewModel.word.observe(this, Observer{newWord ->
binding.wordText.text = newWord
})
我们的UI片段在viewModel的livedata对象上设置观察者,而不是mutablelivedata对象。
它是同一个物体word和
word
都指向MutableLiveData
。然而,从数据类型的角度来看,word
被定义为LiveData
,以对片段隐藏实现细节。
因此,观察者被放置在同一个对象上,该对象将获得值更新。
就我个人而言,我更喜欢这样写代码:
private val _word = MutableLiveData<String>()
val word : LiveData<String> = _word
...和IMHO一样,它更容易阅读,也有同样的效果。
试图让LiveData与Room一起工作: 因为我观察到tdao.getall(),所以我希望在我的活动中,当同步完成时,它会刷新日历。现在,您必须重新加载该活动,以获取在执行同步后放入数据库的数据。我对Room和LiveData很陌生。有什么想法吗?希望我没有拿出太多的代码,这是从一个相当大的应用程序到目前为止。
此外,为什么Viewmodel不能观察到它自己的LiveData的变化?
在livedata的observe方法中有这样一条评论 在给定所有者的生命周期内将给定的观察者添加到观察者列表中。事件在主线程上分派。如果LiveData已经有数据集,它将传递给观察者。 当我尝试向现有livedata实例添加新的观察者时,如果livedata具有数据集,则new观察者的onChanged方法调用。 有什么办法可以避免这种行为吗?我只是不想被通知新的观察员 SingleLiveEv
我有一个视图模型,从场景中接收流作为livedata 在活动中,我们订阅了这个livedata,一些逻辑发生并使用了activityResult 当我们返回时,我们会用最后一个状态触发一个观察者,并再次执行之前的导航逻辑 如何忽略返回时具有相同值的观察者触发器?
我有一个单独的类来处理数据提取(特别是Firebase),我通常从它返回LiveData对象并异步更新它们。现在我希望将返回的数据存储在ViewModel中,但问题是为了获得所述值,我需要观察从数据提取类返回的LiveData对象。observe方法需要一个LifecycleOwner对象作为第一个参数,但我的ViewModel中显然没有这个对象,而且我知道我不应该在ViewModel中保留对ac
我尝试使用这个实现ViewModel。但观察者从未被调用。 基本上,这个应用程序在SAMPLE_URL上发出网络请求,将JSON转换为列表,并通过BookView显示列表。这个应用程序在没有ViewModel的情况下工作得很好。使用ViewModel,应用程序会运行,但Observer从未被调用,也没有显示任何数据。 我在这里做错了什么? BookActivity类: BookViewModel类