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

如何记录OkHttpClient在Android应用中的请求重试日志?

如何记录OkHttpClient的静默重试请求?

OkHttp开启retryOnConnectionFailure后,重试逻辑会在RetryAndFollowUpInterceptor内部静默执行,不过可以通过以下两种方案监控并记录这些重试操作:

方案1:使用EventListener监听重试事件

OkHttp提供的EventListener抽象类可以监听请求生命周期的各个阶段,连接失败、请求失败等事件会在重试触发前被回调,结合请求唯一标识就能追踪重试行为:

public class RetryLogger extends EventListener {
    private String requestId;

    @Override
    public void callStart(Call call) {
        requestId = UUID.randomUUID().toString();
        Log.d("OkHttpRetry", "请求[" + requestId + "]启动");
    }

    @Override
    public void connectFailed(Call call, InetSocketAddress address, Proxy proxy, Protocol protocol, IOException e) {
        Log.d("OkHttpRetry", "请求[" + requestId + "]连接失败,即将触发重试");
    }

    @Override
    public void callFailed(Call call, IOException e) {
        Log.d("OkHttpRetry", "请求[" + requestId + "]重试耗尽,最终失败");
    }

    @Override
    public void callEnd(Call call) {
        Log.d("OkHttpRetry", "请求[" + requestId + "]完成(含重试后成功的情况)");
    }
}

将这个EventListener绑定到OkHttpClient:

OkHttpClient client = new OkHttpClient.Builder()
        .retryOnConnectionFailure(true)
        .eventListener(new RetryLogger())
        .build();

方案2:用网络拦截器统计重试次数

网络拦截器(addNetworkInterceptor)会在每次网络请求(包括重试)时执行,通过它可以记录每次请求的发送行为,从而统计重试次数:

public class RetryCountInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        String requestId = request.tag(String.class);
        if (requestId == null) {
            requestId = UUID.randomUUID().toString();
            request = request.newBuilder().tag(String.class, requestId).build();
        }

        AtomicInteger retryCount = new AtomicInteger(1);
        if (request.tag(AtomicInteger.class) != null) {
            retryCount = (AtomicInteger) request.tag(AtomicInteger.class);
            retryCount.incrementAndGet();
        } else {
            request = request.newBuilder().tag(AtomicInteger.class, retryCount).build();
        }

        Log.d("OkHttpRetry", "请求[" + requestId + "]第" + retryCount.get() + "次发送");
        try {
            Response response = chain.proceed(request);
            Log.d("OkHttpRetry", "请求[" + requestId + "]第" + retryCount.get() + "次发送成功");
            return response;
        } catch (IOException e) {
            Log.d("OkHttpRetry", "请求[" + requestId + "]第" + retryCount.get() + "次发送失败,触发重试");
            throw e;
        }
    }
}

绑定到客户端时使用网络拦截器:

OkHttpClient client = new OkHttpClient.Builder()
        .retryOnConnectionFailure(true)
        .addNetworkInterceptor(new RetryCountInterceptor())
        .build();

注意事项

  • EventListener方式能精准捕捉重试触发的具体原因(如连接超时、DNS解析失败等),适合排查问题的场景
  • 网络拦截器方式可以直接统计实际的请求发送次数,适合简单的重试计数需求
  • 不建议通过反射获取RetryAndFollowUpInterceptor内部的重试计数,OkHttp内部API可能随版本变更导致兼容性问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 09:25:23