Android LiveData包含值,但在分配给变量时为null

wlp8pajw  于 2023-06-20  发布在  Android
关注(0)|答案(2)|浏览(188)

我正在从Room数据库中检索数据,并将其作为LiveData返回。当我将该数据放入Activity中的变量时,它显示为null,但Live数据具有该值。有什么问题吗?

  1. var loginCredentials: User? = null
  2. DBUtils.with(this).getDB().userDao()
  3. .loginValidation(accoutNo, pincode)
  4. .observe(this) {
  5. loginCredentials = it
  6. Log.e("Login it", it.toString())
  7. }
  8. Log.e("Login variable", loginCredentials.toString())

我猜这个值在另一个线程上。我该怎么解决这个问题?

vd2z7a6w

vd2z7a6w1#

因为它在另一个线程上工作。你不能像这样传递值。这是一个异步进程。
您必须创建一个实时数据观察器,并观察活动或片段上的特定元素。这就是它的运作方式
你可以遵循的步骤:
1.初始化变量:-

  1. private val _catValuesList = MutableLiveData<List<Values>>()
  2. val catValuesList: LiveData<List<Values>> = _catValuesList
  1. postvalue in response:-
  1. _catValuesList.postValue(catResponse.data)

1.注意:-

  1. viewModel.catValuesList.observe(viewLifecycleOwner) { list -> }
2ul0zpep

2ul0zpep2#

问题是你在观察者之外显示下面的日志

  1. Log.e("Login variable", loginCredentials.toString())

loginCredentials可能没有分配,因为livedata observer还没有触发,上面的log语句在observer触发之前被调用。
您需要在观察者内部执行任务,以便在loginCredentials变量中具有值。

  1. var loginCredentials: User? = null
  2. DBUtils.with(this).getDB().userDao()
  3. .loginValidation(accoutNo, pincode)
  4. .observe(this) {
  5. loginCredentials = it
  6. Log.e("Login it", it.toString())
  7. Log.e("Login variable", loginCredentials.toString())
  8. }

相关问题