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

dog*_*dog 4 android android-networking okhttp

我试图具体弄清楚我使用 OkHttpClient 发送的请求使用了我的应用程序的数据使用量,并且我发现我可以使用TrafficStats来标记线程,然后使用该标记查看它的网络活动。

如果我做类似的事情

TrafficStats.setThreadStatsTag(1234);
okHttpClient.execute(request);
Run Code Online (Sandbox Code Playgroud)

然后它实际上将其标记为“ok”(ish),但是当我使用异步方法(okHttpClient.enqueue(request))时,它没有(这很明显,尽管我希望他们对此有支持)。

所以我尝试了几件事:

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

有任何想法吗?

Tin*_*Sun 5

我认为 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

然后只需添加这个拦截器

OkHttpClient.Builder client = new OkHttpClient.Builder();
client.addNetworkInterceptor(new TrafficStatInterceptor(trafficTag));
Run Code Online (Sandbox Code Playgroud)