java如何在循环下载期间计算Mbit / s

我有这个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。
这就是我认为的问题
有任何帮助吗?

我可能错了一个数量级或两个数量级,一般的想法如下:

 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; } 

请注意,这会从头开始计算平均速度,而不是当前速度。

我假设这个循环没有在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; }