当前位置: 首页 > 知识库问答 >
问题:

为什么LiveData观测器在设置观测器之前值更改时执行?

哈烨熠
2023-03-14

我像这样测试LiveData

// MainActivity.kt
class MainActivity : AppCompatActivity() {
    
    val testViewModel: TestViewModel by viewModels()
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        testViewModel.testLiveData.value = true
        testViewModel.testLiveData.observe(this) {
            println("Hello")
        }
    }
}
// TestViewModel.kt
class TestViewModel : ViewModel(){
    val testLiveData = MutableLiveData<Boolean>()
    
}

我想<代码>(livedata)。观察mean start观察liveData值的变化<我不认为在设置观察者之前改变的值是不可观察的
但是,它会打印你好
我对实时数据观察者有误解吗?

共有1个答案

舒枫涟
2023-03-14

当你开始观察LiveData时,如果LiveData已经有了一个值,它会立即将该值重放给观察者。这是设计好的,因为LiveData通常处于比视图寿命更长的ViewModel中。例如,当屏幕旋转时,所有的视图都被重新创建,观察再次开始。所有的视图都将用LiveData的最新值更新。如果它不这样做,那么当屏幕旋转并重新创建活动/片段时,它们就会坐在那里,没有什么可观察的,这违背了使用ViewModel来保留比视图寿命更长的状态的目的。

 类似资料:
  • 我有一个片段和一个相应的viewmodel类。我在Fragment方法上从DB获取包装为LiveData的联系人列表。它工作得很好,我使用PagedListAdapter显示联系人列表,如下所示: 我在我的片段中添加了一个观察者,如下所示: 有一个按钮在我的片段,它把我带到另一个屏幕,在那个屏幕上我添加更多的联系人到表。但当我从那个屏幕回到我的片段时,观察者并没有被调用。这意味着返回时不会调用方法

  • 我正在处理代码,其中有很多观察者模式实现。所有这些活动的组织方式如下: 观察者要实现的一些接口: 实现注册、注销和通知的类:

  • 我试图在下面的代码中找出,为什么当我用新数据填充数据库时,Room的LiveData observable没有给我新的班次。 这是放在我的activity的onCreate方法上的: 这是populateAdapter方法: 我还有以下填充数据库的代码(我使用RxJava在IO线程上完成这项工作,因为Room需要在主线程之外调用它的代码): 当我开始观察ShiftsViewModel之后调用per

  • 我有一个加载页面,我想在其中对不相关的信息执行两个网络请求(rxjava)。在这两个请求完成之前,我不想进入下一页,即使其中一个或两个都失败了。 > 使用zip将请求绑定在一起。有没有办法不必被迫使用双函数,也不必返回null? 请求A和B有一个。doOnNext和。多恩。如果其中一个返回错误,zip observable是否继续?zip订阅服务器是否也会返回错误? 这是最好的方法吗?

  • 问题内容: 我一直在类设计方面遇到问题,直到我发现了可观察的(使用观察者设计模式),因此使用它创建了一个小型应用程序,从而解决了我的问题。我为使用一个好的原则解决问题感到高​​兴和自豪。 为什么建议张贴者不要使用可观察的,而要告诉他们使用propertychangelistenr?使用observable是否有任何问题? 问候 问题答案: 观察者和侦听器模式非常相似。但是观察者有一个弱点:所有可观

  • 此外,为什么Viewmodel不能观察到它自己的LiveData的变化?