2016-09-04 116 views
2

我試圖弄清楚我的應用程序的數據使用量有多少被我用OkHttpClient發送的請求使用,並且我看到我可以使用TrafficStats來標記然後用標籤查看網絡活動。Android - OkHttp - 使用TrafficStats標記所有網絡請求

,如果我這樣做

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

那麼它實際上其標記好(ISH),但後來當我使用異步方法(okHttpClient.enqueue(request))它沒有(這是有點明顯,雖然我希望他們對此我有支持)。

所以我嘗試了幾件事情:

  • 設置調度程序客戶端在那裏是一個正常的調度,基本上在每一個執行替換它與新的可運行收到了Runnable首先標籤線程的再運行原始的可運行 - 一些流量被標記,但很多不是。
  • 設置一個套接字工廠,它基本上標記它產生的每個套接字 - 仍然有一些標記的流量,但大部分不是。

任何想法?

回答

1

通常很難做到這一點,因爲HTTP/2套接字是跨請求共享的。在HTTP/1.1中,它們被重用。你最好的辦法是編寫一個network interceptor來標記當前線程。這將處理所有的HTTP/1.1流量和傳出的HTTP/2流量。目前沒有API可以訪問讀取傳入HTTP/2流量的線程。

+0

是的,我想它比其他方法更好地工作的攔截器,但也並不十分準確:/ 你知道的一個很好的方法來計算來自攔截器中的請求/響應對象的字節? (我可以很容易地獲得體長,但是還需要統計網址,方法和頭部信息,我擔心它會不夠準確) – dog

+0

您可能可以使用自定義的SocketFactory和Socket類來完成它。 –

0

我認爲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));