与协程流一起使用时取消改造请求
Cancel retrofit request when using it with coroutine flow
我有如下改造界面:
@GET("products")
fun getProducts(
@Query("limit") limit: Int,
@Query("offset") offset: Int
): Flow<List<Product>>
我像下面这样调用这个方法:
restService
.getProducts(limit, offset)
.flowOn(ioContext)
.catch { /* handle error */ }
.collect { /* handle result */ }
在以下情况下可以调用此代码段:
- 拉动时滑动刷新
- 加载下一部分数据时。
这就是为什么我想在提出新请求之前取消之前的请求。我怎样才能做到这一点?
我认为您最好的选择是 运行 协程中的集合在不再需要数据时被取消。它可以作为流程的一部分。一个例子:
combineTransform(limitFlow, offsetFlow, refreshSignal) {
emitAll(restService.getProducts(limit, offset))
}.collect { }
(此处 refreshSignal 会在需要刷新时发出)。
每次从输入流发出新值时,getProducts()
返回的流都会被取消。
您也可以手动取消收集,保留作业并对其调用取消。
val getProductsJob = launch {
restService
.getProducts(limit, offset)
.flowOn(ioContext)
.catch { /* handle error */ }
.collect { /* handle result */ }
}
...那么您可以随时取消该工作:
getProductsJob.cancel()
我有如下改造界面:
@GET("products")
fun getProducts(
@Query("limit") limit: Int,
@Query("offset") offset: Int
): Flow<List<Product>>
我像下面这样调用这个方法:
restService
.getProducts(limit, offset)
.flowOn(ioContext)
.catch { /* handle error */ }
.collect { /* handle result */ }
在以下情况下可以调用此代码段:
- 拉动时滑动刷新
- 加载下一部分数据时。 这就是为什么我想在提出新请求之前取消之前的请求。我怎样才能做到这一点?
我认为您最好的选择是 运行 协程中的集合在不再需要数据时被取消。它可以作为流程的一部分。一个例子:
combineTransform(limitFlow, offsetFlow, refreshSignal) {
emitAll(restService.getProducts(limit, offset))
}.collect { }
(此处 refreshSignal 会在需要刷新时发出)。
每次从输入流发出新值时,getProducts()
返回的流都会被取消。
您也可以手动取消收集,保留作业并对其调用取消。
val getProductsJob = launch {
restService
.getProducts(limit, offset)
.flowOn(ioContext)
.catch { /* handle error */ }
.collect { /* handle result */ }
}
...那么您可以随时取消该工作:
getProductsJob.cancel()