Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android-OkHttp-使用TrafficStats标记所有网络请求_Android_Okhttp_Android Networking - Fatal编程技术网

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

Android-OkHttp-使用TrafficStats标记所有网络请求,android,okhttp,android-networking,Android,Okhttp,Android Networking,我正试图明确我的应用程序有多少数据被我用OkHttpClient发送的请求使用,我发现我可以用它来标记一个线程,然后用这个标记来查看它的网络活动 如果我做了类似的事情 TrafficStats.setThreadStatsTag(1234); okHttpClient.execute(request); 然后它实际上标记为OK(ish),但是当我使用异步方法(okHttpClient.enqueue(request))时,它就没有了(这是很明显的,尽管我希望他们会支持这一点) 所以我尝试了几件

我正试图明确我的应用程序有多少数据被我用OkHttpClient发送的请求使用,我发现我可以用它来标记一个线程,然后用这个标记来查看它的网络活动

如果我做了类似的事情

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
?@stefankuppelwiser
android.net.TrafficStats.setThreadStatsTag(trafficTag)来自哪里