微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用 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())
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。