Android:如何在不观察的情况下从LiveData中获取价值



块引用

有单独的类来处理数据获取(使用房间(,我通常从中返回对象的 LiveData 列表并更新它们。现在我有一个设置类,当我按"备份"时,我想将返回的数据存储在 ViewModel 中,但问题是为了获取值,我需要观察对象的 LiveData 列表。我不想观察它,因为我只需要值(对象列表(来执行备份。我尝试了以下方法:

@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()
        }
    }
}

活动

fun getGoals(): List<Goal>{
    _viewModel.getGoalsNotLive()
    return _viewModel.goals_NotLive
}

但它仍然返回大小 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
}

最新更新