Почему функция ожидания сопрограммы не заканчивается? - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь сопрограммы сделать сетевой запрос, используя 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

    }
...