`pagingAdapter.submitData()` 之后的代码没有被执行

问题描述

我正在使用 Kotlin Flow 和 Android Paging 3 库编写一个玩具 Android 应用程序。该应用调用一些远程 API 来获取照片列表,并使用带有 RecyclerViewPagingDataAdapter 显示它们。

我发现 pagingAdapter.submitData() 之后的代码没有执行。

这是代码片段(此函数Fragment 中):

  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