Kotlin协程为什么在协程作用域中使用上下文?

Kotlin coroutines why withcontext in coroutinescope?

我只是写了一段代码并使用异步和等待来下载图像。但是 android studio 告诉我为此使用 withcontext。你可以看到下面的代码。但是代码中已经有一个dispatchers.IO。我们已经在 IO 范围内了,为什么还要使用 withContext?这是真正的好做法吗?代码看起来很奇怪。

CoroutineScope(Dispatchers.IO).launch {
        val test = withContext(Dispatchers.IO) {
            val link =
                "https://i.pinimg.com/originals/3b/8a/d2/3b8ad2c7b1be2caf24321c852103598a.jpg"
            ImageProgress.downloadImageToBitmap(link, this@MainActivity)
        }

        runOnUiThread {
            Glide.with(this@MainActivity)
                .load(test)
                .into(binding.imageView)
        }
    }

这表明,因为在 Deferred 上立即调用 await() 是实现与 withContext.

相同的事情的更复杂的方法

在你修复它之后,编译器没有警告,因为它首先是多余的。您还可以删除环绕它的 withContext,因为您已经在要使用的 Dispatcher 上。

您的代码应该是这样的:

GlobalScope.launch(Dispatchers.Main) {
        val test = withContext(Dispatchers.IO) {
            val link = "https://i.pinimg.com/originals[...].jpg"
            ImageProgress.downloadImageToBitmap(link, this@MainActivity)
        }
        Glide.with(this@MainActivity)
             .load(test)
             .into(binding.imageView)
    }

注意我不需要 runOnGuiThread 因为我指定了 Main 调度程序,然后临时切换到 IO 只是为了阻塞操作。

最后,您还应该避免在生产应用程序中使用 GlobalScope,因为如果阻塞 IO 操作需要很长时间,并且用户不断重复导致应用程序执行的操作,您的代码将导致泄漏请求。

您应该有办法完全取消 URL 提取。