我有while
loop
下载文件
while ((val = bis.read(buffer, 0, 1024)) > 0) {
out.write(buffer, 0, val);
fileSize -= val;
if (fileSize < 1024) {
val = (int) fileSize;
}
试图弄清楚如何像许多速度站点那样显示Mbit / s。(链接)
http://www.speedtest.net/
。
希望mesurment留在while
循环内但我有
看过使用on-minute-threads射击但我不知道的例子..
我不知道数据量,或者数据总是1024 这就是我认为的问题 有任何帮助吗?
答案 0 :(得分:7)
我可能错了一两个数量级,一般的想法如下:
long start = System.nanoTime();
long totalRead = 0;
final double NANOS_PER_SECOND = 1000000000.0;
final double BYTES_PER_MIB = 1024 * 1024;
while ((val = bis.read(buffer, 0, 1024)) > 0) {
//...
totalRead += val;
double speedInMBps = NANOS_PER_SECOND / BYTES_PER_MIB * totalRead / (System.nanoTime() - start + 1);
double speedInMbps = speed * 8;
}
请注意,这会从头开始计算平均速度,而不是当前速度。
答案 1 :(得分:4)
我假设这个循环没有在UI线程上执行。在类中声明两个实例变量:
volatile long totalDownloaded;
long downloadStartTime;
修改您的循环代码,如下所示:
totalDownloaded = 0L;
downloadStartTime = System.currentTimeMillis();
while ((val = bis.read(buffer, 0, 1024)) > 0) {
out.write(buffer, 0, val);
totalDownloaded += val;
fileSize -= val;
if (fileSize < 1024) {
val = (int) fileSize;
}
计划在UI线程上运行的任务经常计算System.currentTimeMillis() - downloadStartTime
并使用经过时间和当前值totalDownloaded
来计算平均下载速度并更新显示。您可以在同一个类中使用单独的方法完成所有这些操作:
/**
* Returns average download speed in bytes/second.
*/
public float getDownloadSpeed() {
long elapsedTime = System.currentTimeMillis() - downloadStartTime;
return 1000f * totalDownloaded / elapsedTime;
}