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

时间:2016-09-04 09:34:34

标签: android okhttp android-networking

我正在努力弄清楚我使用OkHttpClient发送的请求使用了多少我的应用程序数据,我看到我可以使用TrafficStats来标记一个线程然后看到它的网络带有标签的活动。

如果我做的话

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

然后它实际上标记它没关系(ish),但是当我使用异步方法(okHttpClient.enqueue(request))时它没有(虽然我希望他们支持它,但这有点明显)。 / p>

所以我尝试了几件事:

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

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

private static class TrafficStatInterceptor implements Interceptor {
    int mTrafficTag;

    TrafficStatInterceptor(int trafficTag) {
        mTrafficTag = trafficTag;
    }

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

然后只需添加此拦截器

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