接続のダウンロード速度を測定する目的で、AsyncTask を使用してファイルをダウンロードしています。ダウンロードの合計バイト数を確認して速度を計算できるように、5 秒後にダウンロードを停止したいと考えています。これが私が使用しているコードです(これはdoInBackground()メソッド内に配置されています):
try{
InputStream is = new URL("http://www.domain.com/linux.iso").openStream();
byte[] buf = new byte[1024];
long startTime = System.nanoTime();
long limitTime = System.nanoTime();
long difference = 0;
while (difference < 5000000000){ /*5 billion nanoseconds = 5 seconds*/
is.read(buf);
limitTime = System.nanoTime();
difference = limitTime - startTime;
}
is.close();
}
catch(Exception e){
e.printStackTrace();
}
WiFiに接続すると、これは正常に機能します。測定された速度はかなり正確で、テストを完了するのにちょうど 5 秒かかります。ただし、3G に移行すると、テストが完了するまでに 10 秒から 15 秒かかります (接続が遅いほど、完了するまでに時間がかかることに気付きました)。
どうして?OS が送信した read() 要求の応答を待っていると推測していますが、よくわかりません。
何があってもダウンロードを 5 秒に制限する方法を知っていますか?
前もって感謝します。