Как использовать Fuel с сопрограммой Kotlin - PullRequest
0 голосов
/ 18 мая 2018

В приложении для Android я пытаюсь использовать Fuel , чтобы сделать HTTP-запрос в сопрограмме Kotlin.Моя первая попытка - использовать синхронный режим внутри обертки, например:

launch(UI) {
    val token = getToken()
    println(token)
}

suspend fun getToken(): String? {
    var (request, response, result = TOKEN_URL.httpGet().responseString()
    return result.get()
}

Но это возвращает android.os.NetworkOnMainThreadException.В документации Fuel упоминаются расширения .await () и .awaitString (), но я не понял этого.

Каков наилучший способ сделать HTTP-запрос Fuel в сопрограмме Kotlin из основного потока пользовательского интерфейса вприложение для Android?Застрял на этом - большое спасибо ...

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Вызов кода блокировки из suspend fun не превращает его автоматически в код приостановки.Вызываемая функция уже должна быть самой suspend fun.Но, как вы уже отметили, у Fuel есть первоклассная поддержка сопрограмм Kotlin, поэтому вам не нужно писать ее самостоятельно.

Я изучил тестовый код Fuel :

Fuel.get("/uuid").awaitStringResponse().third
    .fold({ data ->
        assertTrue(data.isNotEmpty())
        assertTrue(data.contains("uuid"))
    }, { error ->
        fail("This test should pass but got an error: ${error.message}")
    })

Этого должно быть достаточно, чтобы вы начали.Например, вы можете написать простую функцию следующим образом:

suspend fun getToken() = TOKEN_URL.httpGet().awaitStringResponse().third
0 голосов
/ 18 мая 2018

Из документации "для запуска сопрограммы должна быть хотя бы одна функция приостановки, и обычно это лямбда-приостановка"

Попробуйте это:

async {
    val token = getToken()
    println(token)
}
...