Котлин Coroutine возвращается после response.await () - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь создать приложение для Android, которое подключается к API, и для этого я использую Kotlin Coroutines и Retrofit.Я следовал этому руководству (https://android.jlelse.eu/android-networking-in-2019-retrofit-with-kotlins-coroutines-aefe82c4d777), пытаясь настроить свой собственный API, но наткнулся на проблему. Я не могу получить данные из API, потому что не могу обработать ответ.

IЯ не очень разбираюсь в сопрограммах, поэтому я не понимаю, в чем здесь проблема. Если я запускаю отладку и работаю построчно, она работает идеально каждый раз, но если я запускаю приложение, оно печатает только TestPoint1.не выдает никакой ошибки, и ответ всегда 200 ОК. Я попытался объединить

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")
    }
}

1 Ответ

0 голосов
/ 06 мая 2019

Переключите Dispatchers.Main на Dispatchers.IO.Вы не можете сделать этот запрос в главном потоке.Сопрограммам требуется контекст сопрограммы, чтобы знать, в каком потоке они собираются работать.Для этого класс Dispatchers предлагает вам несколько вариантов.В настоящее время вы делаете запрос в Dispatchers.Main, который вы не можете сделать, потому что для извлечения данных из API требуется другой поток.IO является правильным потоком для сетевых вызовов.

Примечание:

Также, пожалуйста, проверьте: разрешение Интернет, подключение к Интернету.

...