我正在使用OkHttp发出同步get请求。为了避免阻塞主线程,我将阻塞的网络调用包装在一个挂起函数和withContext(Dispatchers.IO)中
suspend fun run(): String {
val client = OkHttpClient()
val request = Request.Builder()
.url("https://publicobject.com/helloworld.txt")
.build()
return withContext(Dispatchers.IO) {
val response = client.newCall(request).execute()
return@withContext response.body!!.string()
}
}对于execute()和string()函数,Android Studio都会给出“不适当的阻塞方法调用”的警告。我预计execute()会被阻塞,因为它正在发出同步的http请求。我不明白为什么string()会被认为是阻塞的,因为它只是从变量中检索属性。Kotlin如何确定哪些函数正在阻塞,哪些函数没有阻塞?
发布于 2021-07-22 22:45:55
您需要在协程中调用挂起的fun run()才能使其正常工作。您可能正在使用variable = run()调用它。它期待着回报,但回报还没有准备好。所以它会阻塞等待返回。
https://stackoverflow.com/questions/68483868
复制相似问题