我正在尝试协程在后台线程上使用Retrofit发出网络请求。首先,我将Retrofit的Call
更改为Deferred
。外观如下:
@GET("some_endpoint")
fun getData(@Query("id") id: Int): Deferred<JsonObject>
因此,为了使用上述功能,我创建了suspend
函数并使用了await
。外观如下:
suspend fun getNetworkData(id: Int): Resource<JsonObject> {
try {
val data = api.getData(id).await()
return Resource.success(data)
} catch (e: Exception) {
return Resource.error()
}
}
但是,当我调试我的应用程序时,await
从未完成。断点永远不会返回到返回语句。因此,我决定再次将Deferred
替换为Retrofit的Call
。而且,我决定使用Retrofit的execute
,而不是等待。当然,我删除了suspend关键字。
现在的样子:
@GET("some_endpoint")
fun getData(@Query("id") id: Int): Call<JsonObject>
fun getNetworkData(id: Int): Resource<JsonObject> {
try {
val data = api.getData(id).execute()
return Resource.success(data.body())
} catch (e: Exception) {
return Resource.error()
}
}
然后,它就像一种魅力。我成功获取了数据。但是,我想了解为什么会这样。换句话说,当await
的{{1}}和catch
完成任务时,为什么协程Retrofit
调用未完成甚至没有运行Call
块成功吗?
如果需要,我将在execute
函数上方提供调用方式:
getNetworkData