android PagingSource来自分页库3,结果为回调

1bqhqjot  于 2023-01-28  发布在  Android
关注(0)|答案(2)|浏览(160)

目前,我正尝试迁移到Android的新paging 3库,但如果我没看错的话,我不能:(
我使用AWS Amplify作为后端数据源,并希望将一个查询从分页库包含到PaginSource类的新load函数中。

override suspend fun load(params: LoadParams<String>): LoadResult<String, Car> {
          val query = ListCarsQuery.builder().limit(params.loadSize).build()

          appSyncClient.query(query)
             .responseFetcher(AppSyncResponseFetchers.CACHE_AND_NETWORK)
             .enqueue(
                object : GraphQLCall.Callback<ListCarsQuery.Data>() {
                    override fun onResponse(response: Response<ListCarsQuery.Data>) {
                        val result = CarTransformer.toModels(response)
                        // Here is my actual result list
                    }

                    override fun onFailure(e: ApolloException) {
                        TODO("Not yet implemented")
                    }
                }
        )

          //How can I add my result list here ? 
          return LoadResult.Page(
             data = listOf(),
             prevKey = null,
             nextKey = ""
            )

由于方法enqueues返回一个void,我不知道如何等待它或像分页库2中那样触发回调。在分页库2中,我可以选择调用result.dataenqueue().onResponse函数中的callback.onResult(www.example.com,result.nextLink)方法,而不必返回任何内容。
有没有办法实现它,或者我应该坚持使用第2页?

wvt8vs2t

wvt8vs2t1#

Paging3还没有提供回调API,因此需要将其 Package 到RxJava Single、Guava ListenableFuture或挂起的Kotlin协程中。
PagingSource的Rx版本在paging-rxjava2/3工件中可用,Guava的在paging-guava中可用。
就实际的转换而言,列出所有的可能性是很困难的,但例如KotlinCoroutine构建器允许你在挂起的上下文中 Package 和等待xallback。以suspendCancellableCoroutine为例,你基本上得到了一个Continuation对象,你可以在其上调用resume(result)

dddzy1tm

dddzy1tm2#

正如@dlam提到的,可以按如下方式使用suspendCacellableCoroutinesuspendCoroutine
使用您的示例,它将是:

override suspend fun load(params: LoadParams<String>): LoadResult<String, Car> {

    return suspendCoroutine { continuation ->
        val query = ListCarsQuery.builder().limit(params.loadSize).build()

        appSyncClient.query(query)
                .responseFetcher(AppSyncResponseFetchers.CACHE_AND_NETWORK)
                .enqueue( object : GraphQLCall.Callback<ListCarsQuery.Data>() {
                            override fun onResponse(response: Response<ListCarsQuery.Data>) {
                                val result = CarTransformer.toModels(response)
                                //Here is where you use your continuation object in order to resume the suspended function
                                continuation.resume(LoadResult.Page(
                                        data = result,
                                        prevKey = null,
                                        nextKey = ""
                                ))
                            }

                            override fun onFailure(e: ApolloException) {
                                TODO("Not yet implemented")
                                continuation.resume(LoadResult.Error(e))
                            }
                        }
                )
    }
}

相关问题