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

标签 android okhttp android-networking

我试图弄清楚我使用 OkHttpClient 发送的请求具体使用了多少我的应用程序数据,我发现我可以使用 TrafficStats标记线程,然后使用标记查看它的网络 Activity 。

如果我做类似的事情

TrafficStats.setThreadStatsTag(1234);
okHttpClient.execute(request);

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

所以我尝试了一些事情:

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

有什么想法吗?

最佳答案

我认为 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));

关于Android - OkHttp - 使用 TrafficStats 标记所有网络请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39315521/

相关文章:

android - 尽管我使用的是 LinearLayout,为什么我的 2 个自定义 View 布局彼此重叠

具有基本身份验证的 Android OkHttp

android - 从 JSON url 读取数据但 android 不允许它。NetworkOnMainThread 异常和 StrictMode$AndroidBlockGuardPolicy 错误

android - Retrofit 2 无法上传带有两个额外的单独字符串参数的文件

java - 确定网络类型是 2G、3G 还是 4G

java - OpenGL 扩展可用于不同的 Android 设备

android - 以编程方式从 Android 的内置图库应用程序中获取/选择图像

android - 有什么方法可以使用 'Ionic Native' 的 google-maps 插件实现方向

java - 使用 OkHttp 3 发送原始 POST 请求

android - RxAndroid 2.0.1 订阅方法不设置变量