为什么协程的等待功能没有完成?

时间:2019-02-25 02:43:16

标签: android kotlin retrofit kotlin-coroutines

我正在尝试协程在后台线程上使用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

0 个答案:

没有答案