Я пытаюсь сопрограммы сделать сетевой запрос, используя 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's Call
снова.И вместо ожидания я решил использовать Retrofit's 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
не завершился или даже не запустил блок catch
, когда Retrofit
s Call
и execute
успешно завершили задачу?
Если это необходимо, я предоставляю, как я вызываю выше getNetworkData
функция:
launch {
val result = withContext(Dispatchers.IO) { repo.getNetworkData(id) }
//do something
}