gpt4 book ai didi

android - 发出 Paging3 流后无法收集任何流

转载 作者:行者123 更新时间:2023-12-03 23:44:09 31 4
gpt4 key购买 nike

我正在使用 paging3我有两个不同的寻呼源。问题是Coroutine Scope只发出第一个寻呼流
ViewModel我有两个分页流程

val pagingFlow1 = Pager(PagingConfig(pageSize = 50, prefetchDistance = 1)) {
pagingSource
}.flow.cachedIn(viewModelScope)

val pagingFlow2 = Pager(PagingConfig(pageSize = 50, prefetchDistance = 1)) {
pagingSource2
}.flow.cachedIn(viewModelScope)
在 Activity 中收集它们
    lifecycleScope.launch(Dispatchers.IO) {
viewModel.pagingFlow1.collectLatest { pagingData ->
pagingAdapter.submitData(pagingData)
}
viewModel.pagingFlow2.collectLatest { pagingData ->
pagingAdapter2.submitData(pagingData)
}
}
但是 lifecycleScope只发出 pagingFlow1换句话说,分页只在第一个 recyclerView 工作。
当我这次更改订单时,仅适用于 pagingFlow2
    lifecycleScope.launch(Dispatchers.IO) {
viewModel.pagingFlow2.collectLatest { pagingData ->
pagingAdapter.submitData(pagingData)
}
viewModel.pagingFlow1.collectLatest { pagingData ->
pagingAdapter2.submitData(pagingData)
}
}
为了确保我使用基本流程对其进行了测试并正常工作
// Flows in ViewModel
val testFlow1 = flowOf(1,2,3)
val testFlow2 = flowOf(4,5,6)

// Activity
lifecycleScope.launch(Dispatchers.IO) {
viewModel.testFlow1.collectLatest { item ->
Log.d(item)
}
viewModel.testFlow2.collectLatest { item ->
Log.d(item)
}
}
我不明白为什么在使用分页时只发出第一个流?有人给我一个线索吗?
在尝试不同的事情时,我发现了一些有趣的行为。如果先收集 pagingFlow,我们将无法收集任何东西
    val flow3 = flowOf(1,2,3)
lifecycleScope.launch(Dispatchers.IO) {
flow3.collectLatest { pagingData ->
LogUtils.d("PagingFlow3 $pagingData")
}
viewModel.pagingFlow1.collectLatest { pagingData ->
LogUtils.d("PagingFlow1 $pagingData")
pagingAdapter.submitData(pagingData)
}
viewModel.pagingFlow2.collectLatest { pagingData ->
LogUtils.d("PagingFlow2 $pagingData")
pagingAdapter2.submitData(pagingData)
}
}
flow3收集到 pagingFlow1收集但 pagingFlow2 不是
如果我们把 flow3 放在 pagingFlow1 下面它将 不是
    val flow3 = flowOf(1,2,3)
lifecycleScope.launch(Dispatchers.IO) {
viewModel.pagingFlow1.collectLatest { pagingData ->
LogUtils.d("PagingFlow1 $pagingData")
pagingAdapter.submitData(pagingData)
}
flow3.collectLatest { pagingData ->
LogUtils.d("PagingFlow3 $pagingData")
}
viewModel.pagingFlow2.collectLatest { pagingData ->
LogUtils.d("PagingFlow2 $pagingData")
pagingAdapter2.submitData(pagingData)
}
}
仅限 pagingFlow1

最佳答案

collectLatest 暂停直到流程完成,因此您需要启动单独的作业。
此外,您不需要在 IO 调度程序上进行调度。
编辑:自发布此答案以来对 Paging 的一些更改 - 您调用什么 Dispatcher 不再重要 .submitData上。它唯一影响的可能是 init 分配发生的位置,也许您想从非 ui 线程启动这些分配,但通常它不会影响性能。
例如。,

lifecycleScope.launch {
viewModel.pagingFlow1.collectLatest { pagingData ->
pagingAdapter.submitData(pagingData) } }

lifecycleScope.launch {
viewModel.pagingFlow2.collectLatest { pagingData ->
pagingAdapter2.submitData(pagingData) } }

关于android - 发出 Paging3 流后无法收集任何流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63979474/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com