Строка ответа Fuel HttpGet(), сбой: com.github.kittinunf.fuel.core.Ошибка BubbleFuelError: null

#android #kotlin #kotlin-fuel

#Android #котлин #котлин-топливо

Вопрос:

Проблема

Я хочу получить результат запроса get, выполнив синхронный вызов API, используя Fuel в качестве Httpclient. Я использую Fuel в проекте Android (Anko). Вызов — это всего лишь простой запрос get, который всегда завершается с этой ошибкой:

Сбой: com.github.kittinunf.fuel.core.Ошибка BubbleFuelError: null

Вызвано: com.github.kittinunf.fuel.core.Ошибка BubbleFuelError: null

Предыстория

Я хочу создать функцию для возврата результата простого запроса get с использованием Fuel. Но я не могу получить результат синхронно.

Я не могу найти никакой полезной информации по этому вопросу в Интернете.

Я попытался дождаться результата с помощью сопрограмм и использовать функцию awaitStringResponse. —> Не сработало, как ожидалось.

Только что ответил на проблему Github, охватывающую эту тему (помеченную как ошибка). https://github.com/kittinunf/fuel/issues/606

Есть ли какой-либо обходной путь?

Пример кода

Этот код работает:

 requestUrl.httpGet().responseString { _, _, result ->
     when (result) {
          is Result.Success -> {
             // do something on success
          }
          is Result.Failure -> {
             // do something on fail
          }
     }
}
  

Но, используя эту функцию, я не могу вернуть результат.

Этот код НЕ работает

 val (_,_,result)= Fuel.get(requestUrl).responseString()
  

Ответ №1:

Я нашел способ решить эту проблему с помощью сопрограмм kotlin.

 fun doRequest() = runBlocking {
    val (_, _, result) = Fuel.get("https://jsonplaceholder.typicode.com/posts/1").awaitStringResponse()
    result
}
  

Использование runBlocking заблокирует текущий поток до его завершения.

Источник: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html

Если вы не хотите блокировать текущий поток, вы можете запустить эту функцию в новом потоке следующим образом:

 Thread(
    Runnable {
      val result = doRequest()
      Log.e("Result", result)
    }
).start()
  

Если кто-то знает лучший способ справиться с этим, пожалуйста, покажите свое решение.