首页 > 解决方案 > `pagingAdapter.submitData()` 之后的代码没有被执行

问题描述

我正在使用 Kotlin flow 和 Android Paging 3 库编写一个玩具 Android 应用程序。该应用程序调用一些远程 API 来获取照片列表,并使用 aRecyclerViewPagingDataAdapter.

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

这是代码片段(此函数在 a 中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打印没有问题。

请问为什么会出现这种情况?

标签: androidkotlinkotlin-coroutinesandroid-pagingandroid-paging-library

解决方案


.submitData是一个挂起函数,直到失效或刷新才返回。只要 Paging 正在从PagingData您提供的内容中主动加载(收集),它就不会完成。这就是为什么它必须在已启动的作业中完成。

出于同样的原因,请确保使用collectLatest而不是collect确保您取消并generations尽快开始显示新的。


推荐阅读