Android - OkHttp - 使用 TrafficStats 标记所有网络请求

问题描述 投票:0回答:2

我试图具体弄清楚我使用 OkHttpClient 发送的请求使用了我的应用程序的数据使用量,并且我发现我可以使用 TrafficStats 来标记线程,然后使用标记查看它的网络活动.

如果我做类似的事情

TrafficStats.setThreadStatsTag(1234);
okHttpClient.execute(request);

然后它实际上将其标记为“ok”(ish),但是当我使用异步方法(

okHttpClient.enqueue(request)
)时,它却没有(这很明显,尽管我希望他们对此有支持)。

所以我尝试了几件事:

  • 为客户端设置一个调度程序,它是一个普通的调度程序,基本上在每次执行时都会将它接收到的 Runnable 替换为一个新的 Runnable,该新的 Runnable 首先标记线程,然后运行原始的 Runnable - 一些流量被标记,但很多流量没有。
  • 设置一个套接字工厂,基本上标记它生成的每个套接字 - 仍然有一些流量被标记,但大部分没有。

有什么想法吗?

android okhttp android-networking
2个回答
5
投票

我认为 TrafficStats.setThreadStatsTag() 是针对线程的,所以也许我们可以为 okhttp 客户端添加一个拦截器。

    private static class TrafficStatInterceptor implements Interceptor {
        private int trafficTag;

        TrafficStatInterceptor(int trafficTag) {
            this.trafficTag = trafficTag;
        }

        @Override
        public Response intercept(Chain chain) throws IOException {
            if (trafficTag > 0) {
                TrafficStats.setThreadStatsTag(trafficTag);
            } else {
                Log.w(TAG, "invalid traffic tag " + trafficTag);
            }
            return chain.proceed(chain.request());
        }
    }

然后添加这个拦截器即可

    OkHttpClient.Builder client = new OkHttpClient.Builder();
    client.addNetworkInterceptor(new TrafficStatInterceptor(trafficTag));

1
投票

这通常很难做到,因为 HTTP/2 套接字在请求之间共享。在 HTTP/1.1 中,它们被重用。最好的选择是编写一个网络拦截器来标记当前线程。这将处理所有 HTTP/1.1 流量和传出 HTTP/2 流量。目前没有 API 可以访问读取传入 HTTP/2 流量的线程。

© www.soinside.com 2019 - 2024. All rights reserved.