与协程流一起使用时取消改造请求

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 */ }

在以下情况下可以调用此代码段:

  1. 拉动时滑动刷新
  2. 加载下一部分数据时。 这就是为什么我想在提出新请求之前取消之前的请求。我怎样才能做到这一点?

我认为您最好的选择是 运行 协程中的集合在不再需要数据时被取消。它可以作为流程的一部分。一个例子:

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