Android:如何在不观察的情况下从 LiveData 中获取价值
Android: How to get value from LiveData without Observing it
Blockquote
我有单独的 classes,我在其中处理数据获取(使用 Room),我通常 return 从中获取对象的 LiveData 列表并更新它们。现在我有一个设置 class,当我按下 "Backup" 时,我想将 returned 数据存储在 ViewModel 中,但问题是为了获得值,我需要观察对象的 LiveData 列表。我不想观察它,因为我只需要值(对象列表)来执行备份。
我试过以下方法:
DAO
@Query("SELECT * FROM $DATABASE_TABLE_GOAL")
suspend fun getAllGoals_NotLive(): List<Goal>
视图模型
var goals_NotLive: List<Goal> = ArrayList()
fun getGoalsNotLive(){
_uiScope.launch {
withContext(Dispatchers.IO) {
goals_NotLive = database.goalDao.getAllGoals_NotLive()
}
}
}
Activity
fun getGoals(): List<Goal>{
_viewModel.getGoalsNotLive()
return _viewModel.goals_NotLive
}
但它仍然是 return 尺寸 0。我该怎么办?
现在,您有一个具有如下功能的 DAO:
@Query("...")
fun gimmeData(): LiveData<SomethingOrAnother>
这需要您观察 LiveData
才能执行您的查询。在您的情况下,您不希望在某些情况下这样做。所以,你需要另一个功能。
一个选项是使用函数的同步版本:
@Query("...")
fun gimmeDataSync(): SomethingOrAnother
现在,您不需要观察LiveData
。不过,您需要在后台线程上调用 gimmeDataSync()
。
或者,由于您使用的是 Kotlin,您可以添加 Room 依赖项以支持协程,并且:
@Query("...")
suspend fun gimmeDataAsync(): SomethingOrAnother
再说一次,您不需要观察 LiveData
。您将需要从协程内部调用 gimmeDataAsync()
,例如在 ViewModel
:
上使用 viewModelScope
viewModelScope.launch(Dispatchers.Main) {
val something = dao.gimmeDataAsync()
// TODO do something with something
}
Blockquote
我有单独的 classes,我在其中处理数据获取(使用 Room),我通常 return 从中获取对象的 LiveData 列表并更新它们。现在我有一个设置 class,当我按下 "Backup" 时,我想将 returned 数据存储在 ViewModel 中,但问题是为了获得值,我需要观察对象的 LiveData 列表。我不想观察它,因为我只需要值(对象列表)来执行备份。 我试过以下方法:
DAO
@Query("SELECT * FROM $DATABASE_TABLE_GOAL")
suspend fun getAllGoals_NotLive(): List<Goal>
视图模型
var goals_NotLive: List<Goal> = ArrayList()
fun getGoalsNotLive(){
_uiScope.launch {
withContext(Dispatchers.IO) {
goals_NotLive = database.goalDao.getAllGoals_NotLive()
}
}
}
Activity
fun getGoals(): List<Goal>{
_viewModel.getGoalsNotLive()
return _viewModel.goals_NotLive
}
但它仍然是 return 尺寸 0。我该怎么办?
现在,您有一个具有如下功能的 DAO:
@Query("...")
fun gimmeData(): LiveData<SomethingOrAnother>
这需要您观察 LiveData
才能执行您的查询。在您的情况下,您不希望在某些情况下这样做。所以,你需要另一个功能。
一个选项是使用函数的同步版本:
@Query("...")
fun gimmeDataSync(): SomethingOrAnother
现在,您不需要观察LiveData
。不过,您需要在后台线程上调用 gimmeDataSync()
。
或者,由于您使用的是 Kotlin,您可以添加 Room 依赖项以支持协程,并且:
@Query("...")
suspend fun gimmeDataAsync(): SomethingOrAnother
再说一次,您不需要观察 LiveData
。您将需要从协程内部调用 gimmeDataAsync()
,例如在 ViewModel
:
viewModelScope
viewModelScope.launch(Dispatchers.Main) {
val something = dao.gimmeDataAsync()
// TODO do something with something
}