You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中如何用Retrofit suspend函数处理Void响应?

Android中用Suspend函数处理无返回值(Void)请求的正确方式

在Retrofit中使用suspend函数处理无返回值的请求,有两种常用且规范的实现方式,完全可以替代传统的Call<Void>写法:

1. 直接返回Unit(推荐)

Kotlin的Unit对应Java中的Void,Retrofit会自动适配响应体为空的场景。当接口返回2xx状态码且无响应体时,函数会正常执行完成;若返回非2xx状态码,则抛出HttpException。

示例代码:

@Multipart
@POST("/v3/profile/combine")
suspend fun combineProfile(@PartMap map: Map<String, @JvmSuppressWildcards RequestBody>): Unit

调用时的异常处理示例:

try {
    // 发起请求
    api.combineProfile(yourPartMap)
    // 请求成功后的逻辑
    Toast.makeText(context, "操作成功", Toast.LENGTH_SHORT).show()
} catch (e: HttpException) {
    // 处理HTTP错误(如400参数错误、500服务器异常等)
    Log.e("API_ERROR", "HTTP错误: ${e.code()} ${e.message()}")
} catch (e: IOException) {
    // 处理网络异常(如无网络、连接超时等)
    Log.e("API_ERROR", "网络异常: ${e.message()}")
}

2. 返回Response<Unit>(需获取响应详情时使用)

如果需要获取响应的状态码、响应头等信息(比如处理204 No Content这类特殊状态),可以返回Response<Unit>。这种方式能让你直接判断请求的成功状态,同时拿到完整的响应元数据。

示例代码:

@Multipart
@POST("/v3/profile/combine")
suspend fun combineProfile(@PartMap map: Map<String, @JvmSuppressWildcards RequestBody>): Response<Unit>

调用示例:

try {
    val response = api.combineProfile(yourPartMap)
    if (response.isSuccessful) {
        // 请求成功,可根据状态码做特殊处理
        if (response.code() == 204) {
            Log.d("API_INFO", "无内容返回,但请求成功")
        }
        Toast.makeText(context, "操作成功", Toast.LENGTH_SHORT).show()
    } else {
        // 非2xx状态码,可自行处理错误信息
        Log.e("API_ERROR", "请求失败: ${response.code()}")
    }
} catch (e: IOException) {
    // 处理网络异常
    Log.e("API_ERROR", "网络异常: ${e.message()}")
}

注意事项

  • 不需要在suspend函数中使用Void作为返回类型,Kotlin的Unit是更符合语言习惯的选择,Retrofit对其有完善的支持。
  • 无论哪种方式,网络请求的异常(网络错误、HTTP错误)都需要通过try-catch捕获,避免程序崩溃。

内容的提问来源于stack exchange,提问作者Byron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 06:01:18