You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Retrofit(未集成OkHttp)时遇SocketTimeoutException超时问题求助

排查java.net.SocketTimeoutException: timeout的原因及解决方案

核心原因分析

当你没有为Retrofit指定OkHttp客户端时,Retrofit会默认使用平台自带的HttpURLConnection,它的默认超时设置非常短(通常仅几秒),如果你的请求涉及跨网络传输、较大数据量,或者服务端响应较慢,很容易触发超时异常。另外,你代码里的baseUrl开头多了一个空格( https://...),这会导致Retrofit无法正确解析请求地址,也可能间接引发超时问题!

分步解决方案

1. 先修复baseUrl的格式错误

首先把baseUrl开头的空格去掉,确保地址格式正确:

.baseUrl("https://us-central1-deyapay-192704.cloudfunctions.net/plaidCredentialsAddMoney/")

2. 集成OkHttp并自定义超时配置

虽然Retrofit可以不依赖OkHttp,但OkHttp提供了更灵活的超时控制、连接池管理等功能,这是解决超时问题的最优方案:

第一步:添加OkHttp依赖(Gradle项目)

在Module级别的build.gradle中添加依赖(用最新稳定版即可):

implementation 'com.squareup.okhttp3:okhttp:4.12.0'
第二步:创建自定义OkHttp客户端,设置合理超时时间

根据你的业务场景调整超时时长,比如:

// 构建自定义OkHttpClient,配置超时参数
OkHttpClient okHttpClient = new OkHttpClient.Builder()
        .connectTimeout(30, TimeUnit.SECONDS) // 连接超时:30秒
        .readTimeout(60, TimeUnit.SECONDS)    // 读取响应超时:60秒
        .writeTimeout(60, TimeUnit.SECONDS)   // 写入请求超时:60秒
        .build();
第三步:将自定义客户端关联到Retrofit

修改你的Retrofit构建代码,把OkHttpClient传入:

private void executeForm(String pubToken,String acctToken,Integer Amt,String UID){
    Gson gson = new GsonBuilder()
            .setLenient()
            .create();
    
    // 先创建自定义OkHttp客户端
    OkHttpClient okHttpClient = new OkHttpClient.Builder()
            .connectTimeout(30, TimeUnit.SECONDS)
            .readTimeout(60, TimeUnit.SECONDS)
            .writeTimeout(60, TimeUnit.SECONDS)
            .build();
    
    Retrofit.Builder builder = new Retrofit.Builder()
            .baseUrl("https://us-central1-deyapay-192704.cloudfunctions.net/plaidCredentialsAddMoney/")
            .client(okHttpClient) // 关联自定义客户端
            .addConverterFactory(GsonConverterFactory.create(gson));
    
    Retrofit retrofit = builder.build();
    APIService apiservice=retrofit.create(APIService.class);
    // 后续调用你的API方法并处理回调
    Call<PostData> call = apiservice.yourApiMethod(pubToken, acctToken, Amt, UID);
    call.enqueue(new Callback<PostData>() {
        @Override
        public void onResponse(Call<PostData> call, Response<PostData> response) {
            // 处理成功响应
        }

        @Override
        public void onFailure(Call<PostData> call, Throwable t) {
            // 可以更精准地排查失败原因
            t.printStackTrace();
        }
    });
}

3. 额外排查方向

  • 检查网络环境:确认设备能正常访问目标域名,没有被代理、防火墙拦截
  • 验证服务端响应:用Postman直接调用该API,查看响应时间是否过长,如果是服务端问题,需要后端优化
  • 核对请求参数:确保参数格式符合服务端要求,避免因参数错误导致服务端迟迟不响应

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

火山引擎 最新活动