【问题标题】:How to use Fuel with a Kotlin coroutine如何在 Kotlin 协程中使用 Fuel
【发布时间】:2026-01-10 13:50:02
【问题描述】:

在 Android 应用程序中,我尝试使用 Fuel 在 Kotlin 协程中发出 HTTP 请求。我的第一次尝试是在这样的包装器中使用同步模式:

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() 扩展,但我还没有弄清楚。

从 Android 应用程序的主 UI 线程在 Kotlin 协程中发出 Fuel http 请求的最佳方式是什么?坚持这一点 - 非常感谢...

【问题讨论】:

    标签: android kotlin kotlin-coroutines


    【解决方案1】:

    suspend fun 调用阻塞代码不会自动将其变成挂起代码。您调用的函数本身必须已经是suspend fun。但是,正如您已经指出的,Fuel 对 Kotlin 协程具有一流的支持,因此您不必自己编写。

    我研究过Fuel的test code

    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
    

    【讨论】:

    【解决方案2】:

    来自文档“要启动一个协程,必须至少有一个挂起函数,它通常是一个挂起的 lambda”

    试试这个:

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

    【讨论】:

    • launch(UI) 启动协程。 OP 有。