Android-OkHttp-使用TrafficStats标记所有网络请求
我正试图明确我的应用程序有多少数据被我用OkHttpClient发送的请求使用,我发现我可以用它来标记一个线程,然后用这个标记来查看它的网络活动 如果我做了类似的事情Android-OkHttp-使用TrafficStats标记所有网络请求,android,okhttp,android-networking,Android,Okhttp,Android Networking,我正试图明确我的应用程序有多少数据被我用OkHttpClient发送的请求使用,我发现我可以用它来标记一个线程,然后用这个标记来查看它的网络活动 如果我做了类似的事情 TrafficStats.setThreadStatsTag(1234); okHttpClient.execute(request); 然后它实际上标记为OK(ish),但是当我使用异步方法(okHttpClient.enqueue(request))时,它就没有了(这是很明显的,尽管我希望他们会支持这一点) 所以我尝试了几件
TrafficStats.setThreadStatsTag(1234);
okHttpClient.execute(request);
然后它实际上标记为OK(ish),但是当我使用异步方法(okHttpClient.enqueue(request)
)时,它就没有了(这是很明显的,尽管我希望他们会支持这一点)
所以我尝试了几件事:
- 为客户端设置一个调度程序,它是一个普通的调度程序,基本上在每次执行时都会用一个新的Runnable替换它接收到的Runnable,该Runnable首先标记线程,然后运行原始的Runnable-一些流量被标记,但很多流量没有
- 设置一个插座工厂,基本上标记它生产的每一个插座-仍然有一些流量标记,但大部分没有
有什么想法吗?通常很难做到,因为使用HTTP/2,套接字是跨请求共享的。在HTTP/1.1中,它们被重用。您最好的选择是编写一个标签来标记当前线程。这将处理所有HTTP/1.1流量和传出HTTP/2流量。目前没有API来访问读取传入HTTP/2流量的线程。我认为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));
是的,我尝试了一个拦截器,它比其他方法工作得更好,但也不是很准确:/你知道一个很好的方法来计算拦截器中请求/响应对象的字节数吗?(我可以很容易地获得正文长度,但是还需要计算URL、方法和标题,我担心它最终会不够精确)您可能可以使用自定义SocketFactory和Socket类来完成。我使用的
TrafficStatus
?@stefankuppelwiserandroid.net.TrafficStats.setThreadStatsTag(trafficTag)来自哪里