Kotlin 协程在 response.await() 后返回
Kotlin Coroutine returning after response.await()
我正在尝试制作一个连接到 api 的 android 应用程序,为此我正在使用 Kotlin Coroutines 和 Retrofit。我正在按照本教程 (https://android.jlelse.eu/android-networking-in-2019-retrofit-with-kotlins-coroutines-aefe82c4d777) 尝试设置我自己的 api,但我偶然发现了一个问题。我无法从 api 获取任何数据,因为我无法处理响应。
我不太了解协程,所以我不明白这里的问题是什么。如果我 运行 调试并逐行进行,它每次都运行良好,但如果我 运行 应用程序,它只会打印 TestPoint1。此外,它不会引发任何错误,响应始终为 200 OK。我尝试结合
val standings = service.getStandings()
和
val response = standings.await()
成一行,之后它在调试时也不起作用。它在启动协程后继续执行代码。
val service = ApiFactory.footballApi
GlobalScope.launch(Dispatchers.Main) {
val standings = service.getStandings()
try {
Log.d("TAG", "TestPoint1")
val response = standings.await()
Log.d("TAG", "TestPoint2")
if(response.isSuccessful){
//store data
}else{
Log.d("MainActivity ",response.errorBody().toString())
}
}catch (e: Exception){
Log.d("TAG", "Error")
}
}
将 Dispatchers.Main
切换为 Dispatchers.IO
。您不能在主线程上发出该请求。
协程需要协程上下文才能知道它们将在哪个线程中 运行 。为此,Dispatchers
class 为您提供了一些选择。目前您正在 Dispatchers.Main
中发出请求,但您无法这样做,因为从 API 获取数据需要另一个线程。 IO 是网络调用的正确线程。
注:
另请检查:互联网许可、互联网连接。
我正在尝试制作一个连接到 api 的 android 应用程序,为此我正在使用 Kotlin Coroutines 和 Retrofit。我正在按照本教程 (https://android.jlelse.eu/android-networking-in-2019-retrofit-with-kotlins-coroutines-aefe82c4d777) 尝试设置我自己的 api,但我偶然发现了一个问题。我无法从 api 获取任何数据,因为我无法处理响应。
我不太了解协程,所以我不明白这里的问题是什么。如果我 运行 调试并逐行进行,它每次都运行良好,但如果我 运行 应用程序,它只会打印 TestPoint1。此外,它不会引发任何错误,响应始终为 200 OK。我尝试结合
val standings = service.getStandings()
和
val response = standings.await()
成一行,之后它在调试时也不起作用。它在启动协程后继续执行代码。
val service = ApiFactory.footballApi
GlobalScope.launch(Dispatchers.Main) {
val standings = service.getStandings()
try {
Log.d("TAG", "TestPoint1")
val response = standings.await()
Log.d("TAG", "TestPoint2")
if(response.isSuccessful){
//store data
}else{
Log.d("MainActivity ",response.errorBody().toString())
}
}catch (e: Exception){
Log.d("TAG", "Error")
}
}
将 Dispatchers.Main
切换为 Dispatchers.IO
。您不能在主线程上发出该请求。
协程需要协程上下文才能知道它们将在哪个线程中 运行 。为此,Dispatchers
class 为您提供了一些选择。目前您正在 Dispatchers.Main
中发出请求,但您无法这样做,因为从 API 获取数据需要另一个线程。 IO 是网络调用的正确线程。
注:
另请检查:互联网许可、互联网连接。