问题描述
我正在使用 Kotlin Flow 和 Android Paging 3 库编写一个玩具 Android 应用程序。该应用调用一些远程 API 来获取照片列表,并使用带有 RecyclerView
的 PagingDataAdapter
显示它们。
我发现 pagingAdapter.submitData()
之后的代码没有执行。
fun refreshList() {
lifecycleScope.launch {
photosviewmodel.listPhotos().collect {
// `it` is PagingData<Photo>
pagingAdapter.submitData(it)
Log.e(TAG,"After submitData")
}
}
}
日志 After submitData
未打印。
但是,如果我将日志放在 pagingAdapter.submitData()
行前面,它会被打印出来,如下所示:
fun refreshList() {
lifecycleScope.launch {
photosviewmodel.listPhotos().collect {
// `it` is PagingData<Photo>
Log.e(TAG,"Before submitData")
pagingAdapter.submitData(it)
}
}
}
日志 Before submitData
打印没有问题。
为什么会这样?
解决方法
.submitData
是一个挂起函数,直到失效或刷新才返回。只要 Paging 正在从您提供的 PagingData
主动加载(收集),它就不会完成。这就是为什么它必须在已启动的作业中完成。
出于同样的原因,请务必使用 collectLatest
而不是 collect
,以确保您尽快取消并开始显示新的 generations
。