如何使用协程实现 Paging library 2 Boundary Callback?

How can I implement Paging library 2 Boundary Callback using Coroutines?

我想使用 Paging Library 2 通过协程、liveData 和存储库模式实现我的自定义 PagedList.BoundaryCallback,但我找不到集成这些库的好示例。

即使在 Android official samples 中,他们也使用排队和回调来执行带有分页 2 的 API 请求...

我也阅读了这篇 Medium post,但它在边界回调中使用了协程范围,我认为这不是一个好的做法。

有什么办法可以实现吗?或者我应该迁移到 Paging 3 吗?

这个解决方案适合我:

  1. 我在我的存储库中注入了一个 CoroutinesDispatcherProvider:

    class MyRepository @Inject constructor(
        private val remoteDataSource: MyRemoteDataSource,
        private val localDataSource: MyDao,
        private val coroutinesDispatcherProvider: CoroutinesDispatcherProvider
     ) {...}
    
  2. 然后在我的存储库中,我将此提供程序传递给我的边界回调:

    private val boundaryCallback =
        MyBoundaryCallback(remoteDataSource, localDataSource, coroutinesDispatcherProvider)
    
    fun getList(): LiveData<PagedList<MyModel>> = LivePagedListBuilder(
        localDataSource.getAll(),
        pagedListConfig
    ).setBoundaryCallback(boundaryCallback).build()
    
  3. 最后,我在我的边界实现中使用这个调度程序从存储库启动我的请求:

    private val ioCoroutineScope by lazy {
       CoroutineScope(coroutinesDispatcherProvider.io)
    }
    
    override fun onZeroItemsLoaded() {
        ioCoroutineScope.launch {
            remoteDataSource.getList()
        }
    }