Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么LiveData.getValue在调用observe之前返回null?_Android_Kotlin_Android Room_Android Lifecycle_Android Livedata - Fatal编程技术网

Android 为什么LiveData.getValue在调用observe之前返回null?

Android 为什么LiveData.getValue在调用observe之前返回null?,android,kotlin,android-room,android-lifecycle,android-livedata,Android,Kotlin,Android Room,Android Lifecycle,Android Livedata,我有一个ViewModel,它的属性类型为LiveData,从房间数据库中读取 其代码如下: class UserDataViewModel(application: Application) : AndroidViewModel(application) { private val userDataDao: UserDataDao = AppDatabase.getInstance(application).dao() val userData: LiveData<Us

我有一个ViewModel,它的属性类型为LiveData,从房间数据库中读取

其代码如下:

class UserDataViewModel(application: Application) : AndroidViewModel(application) {

    private val userDataDao: UserDataDao = AppDatabase.getInstance(application).dao()
    val userData: LiveData<UserData?> = userDataDao.getUserData()

}
在该活动中,我需要通过单击按钮获取UserData的值:

private fun handleClick(view: View) {
    viewModel.userData.value?.let {
        // do stuff if the userData is present
    }
}
现在理论上,除非用户在加载数据之前按下按钮,否则该值永远不会为空

但是,在代码中,对viewModel.userData.value的调用始终为null,并且let块永远不会执行

但是,如果我在onCreate中添加此语句,则click处理程序中的let块将按需要执行:

我的问题是:为什么我需要调用observe函数,即使我对更改事件不做任何操作,也要从LiveData::getValue获取有效响应?

您不需要调用observe就可以让LiveData放弃null以外的值。LiveData最初总是包含并生成null,直到有东西设置了它的值。如果您不想要这个初始空值,那么您应该立即将其设置为其他值,然后再将LiveData提供给任何其他组件。如果您想知道它何时第一次包含非null值,您需要使用观察者。

您不需要调用observe来获取LiveData以放弃null以外的值。LiveData最初总是包含并生成null,直到有东西设置了它的值。如果您不想要这个初始空值,那么您应该立即将其设置为其他值,然后再将LiveData提供给任何其他组件。如果您想知道它何时第一次包含非空值,则需要使用观察者

我的问题是:为什么我需要调用observe函数,即使我对一个变更事件什么都不做,也要从LiveData::getValue获得有效的响应

因为从房间DAO返回的ComputableLiveData仅在LiveData.onActive中至少有一个活动观察者时才执行查询。然后它在另一个线程上异步运行,将来某个时候它将被发布到LiveData中

我的问题是:为什么我需要调用observe函数,即使我对一个变更事件什么都不做,也要从LiveData::getValue获得有效的响应


因为从房间DAO返回的ComputableLiveData仅在LiveData.onActive中至少有一个活动观察者时才执行查询。然后它在另一个线程上异步运行,将来某个时候它将被发布到LiveData中。

如果不需要观察数据,为什么要使用LiveData?当您使用observer时,会发出值。这就是实时数据在这个特定实例中的工作方式。我没有观察这些数据。不过,我将在本文稍后的数据绑定中使用它development@Raghunandan也就是说,如果数据绑定已经在观察数据,那么在onCreate?check null合并操作符中,如果没有额外的观察者,我的值检查将正常执行。正如下面的答案所建议的那样,livedata最初将为空。如果您不需要观察数据,为什么要使用livedata?当您使用observer时,会发出值。这就是实时数据在这个特定实例中的工作方式。我没有观察这些数据。不过,我将在本文稍后的数据绑定中使用它development@Raghunandan也就是说,如果数据绑定已经在观察数据,那么在onCreate?check null合并操作符中,如果没有额外的观察者,我的值检查将正常执行。正如下面的答案所建议的,livedata最初将为Null,这不是由视图模型中的这一行完成的吗?val userData:LiveData=userDataDao.getUserDataDao如果这样做,则接受userDataDao在初始值设置的任何内容,初始值为null。你应该观察它,这样你就可以知道它什么时候第一次有一个非空值。谢谢你的回答,但这就是为什么在打开应用程序的1分钟内没有更新它,没有足够的时间访问我正在寻找的数据库的原因-在EpicPandaForce的回答中有详细说明是的,所有LiveData在被观察之前都是不活动的。它们不会放弃任何数据,直到它们变为活动状态,或者直到有人设置初始值(以先到者为准)。这不是由视图模型中的这一行完成的吗?val userData:LiveData=userDataDao.getUserDataDao如果这样做,则接受userDataDao在初始值设置的任何内容,初始值为null。你应该观察它,这样你就可以知道它什么时候第一次有一个非空值。谢谢你的回答,但这就是为什么在打开应用程序的1分钟内没有更新它,没有足够的时间访问我正在寻找的数据库的原因-在EpicPandaForce的回答中有详细说明是的,所有LiveData在被观察之前都是不活动的。他们不会放弃任何数据,直到他们变得活跃,或者直到有人设置初始值-无论哪个值是f
布瑞尔,这正是我想要的答案。我想这是有道理的,在这种情况下,当我完成实现时,它将变得无关紧要。当我遇到它时,我觉得很奇怪。最终,如果您确实打算将LiveData用作绑定表达式的一部分,那么生成的绑定将根据您提供给绑定的lifecycleOwner注册一个观察者。是的,然后你会有一个积极的观察者,这将不再是一个问题。布里尔,这正是我想要的答案。我想这是有道理的,在这种情况下,当我完成实现时,它将变得无关紧要。当我遇到它时,我觉得很奇怪。最终,如果您确实打算将LiveData用作绑定表达式的一部分,那么生成的绑定将根据您提供给绑定的lifecycleOwner注册一个观察者。所以,是的,然后你会有一个积极的观察者,这将不再是一个问题。
private fun handleClick(view: View) {
    viewModel.userData.value?.let {
        // do stuff if the userData is present
    }
}
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    viewModel.userData.observe(this, Observer {
        // do nothing
    })
}