使用 Kotlin 协程和 Flow 从房间链请求

问题描述

我想为不同的 Flow 类型请求两次,然后在单个实时数据中添加结果以进行观察。 但只能得到第一个结果。

ParentModel 是 Note 和 FolderWithNote 数据类的父级。

  val allItems: mutablelivedata<List<ParentModel>> = mutablelivedata()

  fun getAllItems() {
    viewmodelScope.launch {
        noteRepository.getFoldersWithNotes()
            .collect {
                allItems.postValue(it)
            }

        noteRepository.getAllNotes()
            .map {
                databaseNoteMapper.mapFromEntityList(it)
            }
            .collect {
                allItems.postValue(it)
            }
    }
}

我在片段中观察到这样

    viewmodel.allItems.observe(viewLifecycleOwner,{
        adapter.setItems(it)
    })

我想在我的 recyclerView 中显示所有 Notes 和 Folderwithnotes,我在我的 Recycler 适配器中处理它们的不同绑定。

解决方法

这是肯定的,因为第一个 Flow collect 会阻塞等待数据库返回的数据。需要打开两个子协程来完成Flow的collect,而不是全部放在一个子协程中。

编辑


使用异步进行并发。 await 获取 future 对象,合并并发结果并发送给 LiveData。

fun getAllItems() {
    
    viewModelScope.launch {
    val folds = viewModelScope.async {
        noteRepository.getFoldersWithNotes()
    }
    val notes = viewModelScope.async {
        noteRepository.getAllNotes()
            .map {
                databaseNoteMapper.mapFromEntityList(it)
            }
    }
    allItems.postValue(folds.await() + notes.await())
  }
}