我试图弄清楚我使用 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/