如何使用协程实现 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 吗?
这个解决方案适合我:
我在我的存储库中注入了一个 CoroutinesDispatcherProvider:
class MyRepository @Inject constructor(
private val remoteDataSource: MyRemoteDataSource,
private val localDataSource: MyDao,
private val coroutinesDispatcherProvider: CoroutinesDispatcherProvider
) {...}
然后在我的存储库中,我将此提供程序传递给我的边界回调:
private val boundaryCallback =
MyBoundaryCallback(remoteDataSource, localDataSource, coroutinesDispatcherProvider)
fun getList(): LiveData<PagedList<MyModel>> = LivePagedListBuilder(
localDataSource.getAll(),
pagedListConfig
).setBoundaryCallback(boundaryCallback).build()
最后,我在我的边界实现中使用这个调度程序从存储库启动我的请求:
private val ioCoroutineScope by lazy {
CoroutineScope(coroutinesDispatcherProvider.io)
}
override fun onZeroItemsLoaded() {
ioCoroutineScope.launch {
remoteDataSource.getList()
}
}
我想使用 Paging Library 2 通过协程、liveData 和存储库模式实现我的自定义 PagedList.BoundaryCallback,但我找不到集成这些库的好示例。
即使在 Android official samples 中,他们也使用排队和回调来执行带有分页 2 的 API 请求...
我也阅读了这篇 Medium post,但它在边界回调中使用了协程范围,我认为这不是一个好的做法。
有什么办法可以实现吗?或者我应该迁移到 Paging 3 吗?
这个解决方案适合我:
我在我的存储库中注入了一个 CoroutinesDispatcherProvider:
class MyRepository @Inject constructor( private val remoteDataSource: MyRemoteDataSource, private val localDataSource: MyDao, private val coroutinesDispatcherProvider: CoroutinesDispatcherProvider ) {...}
然后在我的存储库中,我将此提供程序传递给我的边界回调:
private val boundaryCallback = MyBoundaryCallback(remoteDataSource, localDataSource, coroutinesDispatcherProvider) fun getList(): LiveData<PagedList<MyModel>> = LivePagedListBuilder( localDataSource.getAll(), pagedListConfig ).setBoundaryCallback(boundaryCallback).build()
最后,我在我的边界实现中使用这个调度程序从存储库启动我的请求:
private val ioCoroutineScope by lazy { CoroutineScope(coroutinesDispatcherProvider.io) } override fun onZeroItemsLoaded() { ioCoroutineScope.launch { remoteDataSource.getList() } }