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
}