2016-03-20 3 views
0

Я хочу построить тест скорости загрузки Android. Для этого я использую класс TrafficStats. Проблема в том, что я получаю неправильные результаты. Результаты почти одинаковы, когда я запускаю тест, но я загрузил большую нагрузку на мое интернет-соединение, прежде чем запускать тест. Я загружаю файл в течение 30 секунд и после этого (или когда файл загружается), а затем вычисляет байты с использованием TrafficStatsРассчитанная скорость загрузки неверна при использовании класса TrafficStats

Кто-нибудь знает, где проблема?

Это код, который я использую:

@Override 
     protected String doInBackground(String... urls) { 
      String downloaded =""; 
      // String uploaded = ""; 
      try{ 

       long BeforeTime = System.currentTimeMillis(); 
       long TotalTxBeforeTest = TrafficStats.getTotalTxBytes(); 
       long TotalRxBeforeTest = TrafficStats.getTotalRxBytes(); 
       URL url = new URL(urls[0]); 
       URLConnection connection = new URL(urls[0]).openConnection(); 
       connection.setUseCaches(false); 
       connection.connect(); 
       InputStream input = connection.getInputStream(); 

       BufferedInputStream bufferedInputStream = new BufferedInputStream(input); 
       byte[] buffer = new byte[1024]; 
       int n = 0; 
       long endLoop = BeforeTime+30000; 
       while(System.currentTimeMillis() < endLoop) { 
        /* if (bufferedInputStream.read(buffer) != -1){ 
         break; 
        }*/ 
       } 
       long TotalTxAfterTest = TrafficStats.getTotalTxBytes(); 
       long TotalRxAfterTest = TrafficStats.getTotalRxBytes(); 
       long AfterTime = System.currentTimeMillis(); 

       double TimeDifference = AfterTime - BeforeTime; 
       double rxDiff = TotalRxAfterTest - TotalRxBeforeTest; 
       double txDiff = TotalTxAfterTest - TotalTxBeforeTest; 
       Log.e(TAG, "Download skinuto. "+ rxDiff); 
       if((rxDiff != 0) && (txDiff != 0)) { 
        double rxBPS = (rxDiff/(TimeDifference/1000)); // total rx bytes per second. 
        double txBPS = (txDiff/(TimeDifference/1000)); // total tx bytes per second. 
        downloaded = String.valueOf(rxBPS) + "B/s. Total rx = " + rxDiff; 
        // uploaded = String.valueOf(txBPS) + "B/s. Total tx = " + txDiff; 
       } 
       else { 
        downloaded = "No downloaded bytes."; 
       } 
      } 
      catch(Exception e){ 
       Log.e(TAG, "Error while downloading. "+ e.getMessage()); 
      } 
      return downloaded; 
     } 

ответ

0

Я попробовал ваш код - это, кажется, работает хорошо для меня, но я изменил

while(System.currentTimeMillis() < endLoop) { 
    /* if (bufferedInputStream.read(buffer) != -1) { 
      break; 
     }*/ 
} 

в

while(System.currentTimeMillis() < endLoop) { 
    if (bufferedInputStream.read(buffer) == -1){ 
     break; 
    } 
} 

так read возвращает -1, если конец потока достигнут.