【问题标题】:How to cancel and replace Kotlin Coroutine Call如何取消和替换 Kotlin 协程调用
【发布时间】:2019-10-08 08:02:40
【问题描述】:

我正在我当前的 Android 应用程序中试验 Kotlin 协程。

我有一个用例,用户可以使用远程 RestFul API 搜索文本。

我想要达到的效果如下:-

1)。使用类型“ABC”,我在这个搜索字符串中启动我的远程 API

viewModelScope.launch {
  repository.searchAPI(searchString)
}

2)。用户现在键入更多,因此我的搜索字符串现在是“ABCXYZ”

我现在希望取消对“ABC”的初始搜索,并将其替换为新的搜索字符串“ABCXYZ”

我以为我可以使用此代码...

viewModelScope.launch {

  if (isActive) {
    this.coroutineContext.cancelChildren()
  }

  repository.searchAPI(searchString)
}

但是这会取消整个过程

如何使用最新的搜索字符串替换当前正在执行的搜索,从而达到预期的效果?

【问题讨论】:

标签: android kotlin kotlin-coroutines


【解决方案1】:

您可以将搜索作业存储在视图模型的字段中,并在新搜索时取消它。它会是这样的:

var searchJob: Job? = null
...
searchJob?.cancel()
searchJob = viewModelScope.launch {
  repository.searchAPI(searchString)
}

【讨论】:

  • 另外:如果函数在控制器内部调用,每次传入调用都会启动一个新线程,请确保同步searchJob访问。
  • 它有时会给我这个错误,kotlinx.coroutines.JobCancellationException: StandaloneCoroutine was cancelled; job=StandaloneCoroutine{Cancelled}
  • 请记住,.cancel() 实际上并没有取消您的工作。它只是将 Job 的状态更改为 Cancelled。因此,如果在 .searchAPI() 调用中您不检查协程上下文是否仍然处于活动状态,您将有 2 个搜索进程在运行。
【解决方案2】:

您可以按如下方式取消您的协程调用

 val job =viewModelScope.launch {
      repository.searchAPI(searchString)
    }
job.cancel() // cancels the job

【讨论】:

    猜你喜欢
    • 2019-12-06
    • 1970-01-01
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 2021-10-02
    • 2023-02-03
    • 1970-01-01
    相关资源
    最近更新 更多