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

时间:2019-07-14 16:53:52

标签: android kotlin android-livedata

  

Blockquote

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

DAO

@Query("SELECT * FROM $DATABASE_TABLE_GOAL")
suspend fun getAllGoals_NotLive(): List<Goal>

ViewModel

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。我该怎么办?

1 个答案:

答案 0 :(得分:2)

现在,您有一个具有以下功能的DAO:

@Query("...")
fun gimmeData(): LiveData<SomethingOrAnother>

这要求您遵守LiveData才能执行查询。就您而言,在某些情况下您不希望这样做。因此,您需要另一个功能。

一个选择是拥有该功能的同步版本:

@Query("...")
fun gimmeDataSync(): SomethingOrAnother

现在,您无需遵守LiveData。不过,您将需要在后台线程上调用gimmeDataSync()

或者,由于您使用的是Kotlin,因此您可以添加Room依赖以获取协程支持,并具有:

@Query("...")
suspend fun gimmeDataAsync(): SomethingOrAnother

再次,您不需要遵守LiveData。您需要从协程内部调用gimmeDataAsync(),例如在viewModelScope上使用ViewModel

viewModelScope.launch(Dispatchers.Main) {
  val something = dao.gimmeDataAsync()
  // TODO do something with something
}