【问题标题】:How can I implement Paging library 2 Boundary Callback using Coroutines?如何使用协程实现分页库 2 边界回调?
【发布时间】:2021-08-30 15:12:55
【问题描述】:

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

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

我也阅读了此 Medium post,但它在边界回调内使用协程范围,我认为这不是一个好习惯。

有什么方法可以实现吗?还是应该迁移到 Paging 3?

【问题讨论】:

  • 您可以使用suspendCancellableCoroutinesuspendCoroutineenqueue 调用转换为挂起函数。您可以使用callbackFlow 将重复调用的回调转换为您可以在协程中收集的流。我不使用分页,所以无法写出正确的答案。以上应该足以让您谷歌一些如何进行这些转换的示例。虽然如果你正在经历迁移到协程的麻烦,我不明白你为什么不迁移到最新的分页库。
  • 我对具体的分页库了解不多,但在版本 3 中明确说明他们添加了对 Kotlin 协程的一流支持,所以如果这是一个选项,我会诚实地去升级你。如果没有,那么是的,您可以使用@Tenfour04 提到的技术

标签: android kotlin kotlin-coroutines android-paging-library


【解决方案1】:

这个解决方案对我有用:

  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()
        }
    }
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 2018-10-31
    • 2023-02-22
    • 2019-09-27
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    相关资源
    最近更新 更多