【问题标题】:Interrupt HttpURLConnection by kotlin coroutines通过 kotlin 协程中断 HttpURLConnection
【发布时间】:2021-03-30 16:40:02
【问题描述】:

我正在尝试像这样将 HttpURLConnection 与 Kotlin 协程一起使用

var downloadJob: Job? = null

fun triggerDownload() { 
    job = downloadFile()
}

override fun onBackPressed() {
    downloadJob.cancel()
    super.onBackPressed()
}

fun downloadFile() = launch {
    withContext(Dispatchers.IO) {
        var connnection: HttpURLConnection? = null
        try {
            connnection = url.openConnection() as HttpURLConnection
            connnection.connect()
            //do the work
        } catch (e: Exception) {
            //handle exception
        } finally {
            connnection?.disconnect()
        }
    }
}

当作业被取消时,预计会抛出 CancellationException,但由于某种原因,在建立连接时不会发生这种情况。 有没有办法通过取消作业来中断连接尝试?

【问题讨论】:

    标签: android kotlin httpurlconnection kotlin-coroutines


    【解决方案1】:

    正如文档所述cancellation is cooperative。这意味着协程代码有责任检查取消并抛出异常。协程库中的所有挂起函数都是可取消的(即它们检查取消),因此通常它会自动工作。显然HttpURLConnection 不是这种情况——它对协程一无所知,并且显然不检查取消。而且据我所知,这个电话根本无法取消。您可能需要考虑使用像 okhttp 这样的库并为其编写自己的可取消协程适配器,或者寻找一个开箱即用支持协程的库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-12
      • 2017-11-26
      • 1970-01-01
      • 2021-06-27
      • 2021-06-18
      • 2018-05-13
      • 1970-01-01
      相关资源
      最近更新 更多