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

Retrofit/OkHttp莫名5秒延迟求助:Android应用特定请求异常耗时

Troubleshooting Unexpected 5s Latency with Retrofit/OkHttp Requests

Hey there, let's break down this frustrating latency issue you're facing. Since you've confirmed the server is behaving normally (smart move checking the browser first!), we can narrow our focus to client-side configurations and behaviors in OkHttp/Retrofit that might be causing those specific requests to lag.

Here are the most likely culprits and steps to test them:

1. Connection Pool Limits Blocking Reuse

OkHttp's default connection pool allows 5 concurrent connections per host. If your app is firing more than 5 simultaneous requests to that specific endpoint, new requests will wait for an existing connection to be released—this could easily add up to 5+ seconds of delay.

Test Fix:

Adjust the connection pool parameters to allow more concurrent connections for that host:

ConnectionPool largerPool = new ConnectionPool(10, 5, TimeUnit.MINUTES); // 10 total connections, 5min idle timeout

OkHttpClient client = new OkHttpClient.Builder()
    .connectionPool(largerPool)
    .build();

2. Retry Mechanism Triggering Unnecessary Delays

OkHttp's default RetryAndFollowUpInterceptor will retry requests on connection failures, timeouts, or certain HTTP errors. If your specific endpoint is hitting transient issues (even tiny ones), a retry could double the latency—adding up to your observed 5s delay.

Test Fix:

Temporarily disable retries to see if the latency disappears (note: don't leave this disabled long-term unless you're sure you don't need retries):

OkHttpClient client = new OkHttpClient.Builder()
    .retryOnConnectionFailure(false)
    .build();

3. Hidden Latency in Request/Response Processing

You need visibility into exactly where the delay is happening (e.g., DNS lookup, TCP handshake, request body writing, response reading). Add a logging interceptor to capture detailed timing data for the problematic requests.

Implementation:

Interceptor timingInterceptor = new Interceptor() {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        
        // Log request start time
        long requestStart = System.nanoTime();
        Log.d("OkHttpDebug", String.format("Starting request to %s", request.url()));
        
        Response response = chain.proceed(request);
        
        // Calculate total duration
        long requestEnd = System.nanoTime();
        long durationMs = (requestEnd - requestStart) / 1000000;
        Log.d("OkHttpDebug", String.format("Completed request to %s in %dms", 
                response.request().url(), durationMs));
        
        // You can also log connection details to check handshake time
        Connection connection = chain.connection();
        if (connection != null) {
            Log.d("OkHttpDebug", String.format("Connection used: %s, TLS: %s",
                    connection.socket().getInetAddress(), connection.protocol()));
        }
        
        return response;
    }
};

OkHttpClient client = new OkHttpClient.Builder()
    .addInterceptor(timingInterceptor)
    .build();

Check the logs to see if the delay is concentrated in a specific phase (e.g., a 5s DNS lookup or SSL handshake).

4. DNS Resolution Mismatch

Even though your browser resolves the endpoint quickly, your app might be using a slower system DNS server or hitting DNS cache issues.

Test Fix:

Force OkHttp to use a reliable public DNS to rule out DNS-related delays:

Dns customDns = hostname -> Arrays.asList(
        InetAddress.getByName("8.8.8.8"),
        InetAddress.getByName("8.8.4.4")
);

OkHttpClient client = new OkHttpClient.Builder()
    .dns(customDns)
    .build();

5. Dispatcher Queue Backlogs

OkHttp's default Dispatcher limits total concurrent requests to 64 and 5 per host. If your app is flooding the dispatcher with other requests, the problematic endpoint's requests might be stuck in a queue.

Test Fix:

Increase the dispatcher limits temporarily to see if latency improves:

Dispatcher expandedDispatcher = new Dispatcher();
expandedDispatcher.setMaxRequests(100);
expandedDispatcher.setMaxRequestsPerHost(10);

OkHttpClient client = new OkHttpClient.Builder()
    .dispatcher(expandedDispatcher)
    .build();

Next Steps

Start with the logging interceptor—it will give you concrete data on where the delay is occurring. Once you identify the phase (connection, retry, DNS), you can apply the targeted fix above.


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:29:41