【发布时间】:2012-08-28 11:21:07
【问题描述】:
我正在开发一个 Android 应用程序,我需要尽可能准确地测量当前连接的下载速度。这是迄今为止我能找到的最好的方法(基本上我启动一个计时器,开始从快速服务器下载 Linux 发行版,下载大约 200 KB,然后停止计时器并检查经过的时间和下载的总字节数):
try{
InputStream is = new URL("http://www.domain.com/ubuntu-linux.iso").openStream();
byte[] buf = new byte[1024];
int n = 0;
startBytes = TrafficStats.getTotalRxBytes(); /*gets total bytes received so far*/
startTime = System.nanoTime();
while(n<200){
is.read(buf);
n++;
}
endTime = System.nanoTime();
endBytes = TrafficStats.getTotalRxBytes(); /*gets total bytes received so far*/
totalTime = endTime - startTime;
totalBytes = endBytes - startBytes;
}
catch(Exception e){
e.printStackTrace();
}
之后,我只需要将传输的字节数除以所用时间,就可以得出下载速度(以 bps 为单位)。
问题: 1. 这种方法准确吗? 2. 你知道更好的吗?
非常感谢。
【问题讨论】:
-
他们现在设置它的方式,它不会是准确的。
InputStream.read不能保证完全填满你的缓冲区。您需要检查返回值以查看实际读取了多少bytes。 -
@Jeffrey,您没有详细阅读代码。我不依赖 read() 来获取字节数。我通过 getTotalRxBytes() 函数直接从操作系统获取它。
-
啊,我的错。我确实略过了那部分。您的解决方案或多或少是准确的。
-
@Jeffrey,谢谢。如果您对如何使它更多有任何想法,请告诉我。
标签: java android networking 3g