我正在努力弄清楚我使用OkHttpClient发送的请求使用了多少我的应用程序数据,我看到我可以使用TrafficStats来标记一个线程然后看到它的网络带有标签的活动。
如果我做的话
TrafficStats.setThreadStatsTag(1234);
okHttpClient.execute(request);
然后它实际上标记它没关系(ish),但是当我使用异步方法(okHttpClient.enqueue(request)
)时它没有(虽然我希望他们支持它,但这有点明显)。 / p>
所以我尝试了几件事:
有什么想法吗?
答案 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));