Jetpack Compose中修改OkHttp客户端默认超时时间问题
OkHttp超时配置不生效的解决方法
问题根源
你已经通过OkHttpClient.Builder配置了30秒的超时参数,但在实际调用API时,代码里重新创建了默认的OkHttpClient()实例,完全没用到自己配置好的客户端,导致超时设置根本没生效。
修复步骤
- 创建可复用的配置好的OkHttpClient实例
建议在全局作用域(比如顶层文件、ViewModel初始化块)创建一次,避免重复实例化:
import java.util.concurrent.TimeUnit import okhttp3.OkHttpClient // 全局复用的OkHttpClient,已配置超时 val okHttpClient = OkHttpClient.Builder() .connectTimeout(30, TimeUnit.SECONDS) // 连接超时 .readTimeout(30, TimeUnit.SECONDS) // 读取超时 .writeTimeout(30, TimeUnit.SECONDS) // 写入超时 .build()
- 在API调用中使用该配置好的客户端
修改LaunchedEffect里的代码,替换默认客户端为上面配置的实例:
LaunchedEffect(Unit) { val request = Request.Builder() .url("https://plantwise.p.rapidapi.com/plant/?plant_type=$plantName") .get() .addHeader("X-RapidAPI-Key", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx") .addHeader("X-RapidAPI-Host", "xxxxx.rapidapi.com") .build() val response = withContext(Dispatchers.IO) { okHttpClient.newCall(request).execute() // 使用配置好的客户端 } val responseData = response.body?.string() if (responseData != null) { plantData = gson.fromJson(responseData, PlantData::class.java) } }
额外提示
OkHttpClient是线程安全的,全局复用能有效复用连接池,提升请求性能,避免不必要的资源消耗。- 如果修改后仍出现超时问题,可以检查RapidAPI的服务可用性,或者考虑给OkHttpClient添加重试拦截器,处理临时的网络波动。
内容的提问来源于stack exchange,提问作者Zzzzzz
相关产品推荐
相关产品推荐

