有没有办法计算出 OkHttp 中的内容下载时间?

Is there a way to figure out content download time in OkHttp?

我正在尝试计算我的 Android 应用程序中的网络带宽。我如何使用 OkHttp3 库计算响应下载时间(不包括我的 HTTP 请求的周转时间)?

在我的应用程序级拦截器中,我可以访问 Response 并且我看到 sentRequestAtMillisreceivedResponseAtMillis 等属性。而且我认为以下等式对我的情况不准确,因为:

receivedResponseAtMillis - sentRequestAtMillis = requestSendTime + Server Latency + responseDownloadTime

所以我想弄清楚是否有一种方法可以将服务器延迟和 requestSendTime 排除在这个等式之外,并且可以获得 responseDownloadTime?

我尝试在调用 chain.proceed(request) 后立即获取时间戳:


        Request request = chain.request();
        Response response = chain.proceed(request);
        String url = request.url().toString();

        long currentTimeMillis = System.currentTimeMillis();

        double contentDownloadTimeInSecs = (currentTimeMillis - response.receivedResponseAtMillis()) / 1000.0;

        double requestRoundTripTimeInSecs = (currentTimeMillis - response.sentRequestAtMillis()) / 1000.0;


    }

我想到这个只是因为在
的文档中 receivedResponseAtMillis() https://square.github.io/okhttp/3.x/okhttp/okhttp3/Response.html#receivedResponseAtMillis-- 我读到它是从网络收到响应的 headers 时立即采取的时间戳。 所以也许减去我在上面的代码片段中显示的方式,我可以获得响应下载时间?

当我使用 NetworkLinkConditioner 等节流软件节流我的应用程序时。基于我在上面使用的机制,我看到了不一致的值。所以不太确定这是否是实现此目标的正确方法。

请帮助验证我的理论,如果有人能谈谈如何使用 OkHttp 捕获 contentDownloadTime 或者它是否根本不可能,我将不胜感激。

谢谢

看看 OkHttp 的 EventListener,它会在您的 HTTP 调用中触发许多有趣的事件。如果你喜欢可以使用它,或者一个拦截器,这两者都可以在发生感兴趣的事情时记录系统时钟。