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

如何优化Jetpack Compose中Retrofit的HTTP请求耗时?

无服务器权限下优化Retrofit API请求耗时的实用方案

你当前用Jetpack Compose开发移动端应用,Retrofit调用API平均耗时350ms、响应数据230kB,且无服务器修改权限,以下是可落地的优化建议:

1. 尝试字段过滤(如果API支持)

很多公开REST API支持通过请求参数指定返回字段(比如fields、select参数),直接在请求URL中添加这类参数,只获取业务需要的字段,能大幅减少响应数据体积,降低传输和解析耗时。比如原请求是GET /user,可改为GET /user?fields=id,nickname,avatar,只返回必要字段。

2. 强制启用Gzip压缩

OkHttp默认支持自动解码gzip压缩的响应,但需要确保请求头带上Accept-Encoding: gzip。230kB的JSON经过gzip压缩后通常能降到50kB以内,传输耗时会明显减少。可以手动添加拦截器确保请求头正确:

val gzipRequestInterceptor = Interceptor { chain ->
    val originalRequest = chain.request()
    val compressedRequest = originalRequest.newBuilder()
        .header("Accept-Encoding", "gzip, deflate")
        .build()
    chain.proceed(compressedRequest)
}

val client = OkHttpClient.Builder()
    .addInterceptor(chuckerInterceptor)
    .addInterceptor(gzipRequestInterceptor)
    .build()

3. 精简JSON解析逻辑

你当前使用的kotlinx.serialization已经是高效的解析库,可进一步优化:

  • 确保数据类只定义业务需要的字段,多余字段不要出现在数据类中(ignoreUnknownKeys = true已经能忽略未知字段,但精简数据类能减少解析时的映射开销)
  • 保持默认的严格解析配置,无需额外开启isLenient = true(除非JSON格式本身不规范)

4. 添加本地缓存策略

如果API数据不是强实时的,给OkHttp添加缓存,让重复请求直接读取本地缓存,完全避免网络请求。示例代码:

// 创建10MB的缓存目录
val cache = Cache(
    directory = androidApplication().cacheDir.resolve("http_cache"),
    maxSize = 10 * 1024 * 1024L // 10MB
)

// 缓存拦截器,设置缓存有效期
val cacheInterceptor = Interceptor { chain ->
    val response = chain.proceed(chain.request())
    response.newBuilder()
        .header("Cache-Control", "public, max-age=300") // 缓存5分钟
        .build()
}

val client = OkHttpClient.Builder()
    .addInterceptor(chuckerInterceptor)
    .addNetworkInterceptor(cacheInterceptor)
    .cache(cache)
    .build()

5. 移除调试拦截器(正式环境)

ChuckerInterceptor是调试用的工具,它会额外读取响应体内容,增加请求耗时。正式环境一定要移除,可通过BuildConfig区分环境:

val clientBuilder = OkHttpClient.Builder()
if (BuildConfig.DEBUG) {
    val chuckerInterceptor = ChuckerInterceptor.Builder(androidApplication())
        .collector(ChuckerCollector(androidApplication()))
        .maxContentLength(250000L)
        .redactHeaders(emptySet())
        .alwaysReadResponseBody(false)
        .build()
    clientBuilder.addInterceptor(chuckerInterceptor)
}
val client = clientBuilder.build()

6. 优化连接池复用

调整OkHttp的连接池参数,复用TCP连接,减少TCP握手的耗时:

val connectionPool = ConnectionPool(
    maxIdleConnections = 6, // 增大空闲连接数
    keepAliveDuration = 60, // 延长连接存活时间
    TimeUnit.SECONDS
)

val client = OkHttpClient.Builder()
    .addInterceptor(chuckerInterceptor)
    .connectionPool(connectionPool)
    .build()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:43:27