我用Kotlin编写了这段代码,以使用协程下载一些API信息来下载数据。但是,该代码显示了许多警告,指出该消息为“不适当的阻止方法调用”。
这是代码:
class DownloadInfoClass {
private lateinit var url: URL
private lateinit var httpURLConnection: HttpURLConnection
private lateinit var result: String
private lateinit var inputStream: InputStream
private lateinit var inputStreamReader: InputStreamReader
private var dataMap: MutableMap<String, Any> = mutableMapOf()
private fun downloadMethod(urls: String){
CoroutineScope(IO).launch {
try {
url = URL(urls)
httpURLConnection = url.openConnection() as HttpURLConnection
inputStream = httpURLConnection.inputStream
inputStreamReader = InputStreamReader(inputStream)
var data: Int = inputStreamReader.read()
while (data != -1){
val current: Char = data.toChar()
result += current
data = inputStreamReader.read()
}
}
catch (e: Exception){
e.printStackTrace()
}
}
Log.i("Result: ", result)
}
}
发生此问题的特定区域是:
URL(urls)
openConnection()
read()
谁能帮助我了解为什么会这样?我通读了Kotlin文档,但无法理解。另外,您能告诉我如何解决此问题吗?
问题是,协程被构建为仅挂起而不阻塞线程。这意味着,多个协程可以在同一线程上运行。使用阻塞方法时,它们将阻塞整个线程,并且可能会阻止其他协程运行。因此,这样做通常是不好的做法。
由于显然您需要调用这些方法,因此请使用一个调度程序,尝试为每个协程创建一个新线程,例如Dispatchers.IO
(针对这些操作而设计,请参见文档)。为此,只需使用来包装阻塞调用withContext
。
withContext(Dispatchers.IO) {
// your blocking calls
}
希望我能帮上忙!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句