我试图具体弄清楚我使用 OkHttpClient 发送的请求使用了我的应用程序的数据使用量,并且我发现我可以使用 TrafficStats 来标记线程,然后使用标记查看它的网络活动.
如果我做类似的事情
TrafficStats.setThreadStatsTag(1234);
okHttpClient.execute(request);
然后它实际上将其标记为“ok”(ish),但是当我使用异步方法(
okHttpClient.enqueue(request)
)时,它却没有(这很明显,尽管我希望他们对此有支持)。
所以我尝试了几件事:
有什么想法吗?
我认为 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));
这通常很难做到,因为 HTTP/2 套接字在请求之间共享。在 HTTP/1.1 中,它们被重用。最好的选择是编写一个网络拦截器来标记当前线程。这将处理所有 HTTP/1.1 流量和传出 HTTP/2 流量。目前没有 API 可以访问读取传入 HTTP/2 流量的线程。