我正在开发一个
Android应用程序,我需要尽可能准确地测量当前连接的下载速度.这是我到目前为止找到的最好的方法(基本上我启动一个计时器,开始从快速服务器下载Linux发行版,下载大约200千字节,然后停止计时器并检查已用时间和下载的总字节数):
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为单位给出下载速度.
问题:
这种方法准确吗?
你知道一个更好的吗?
非常感谢.
解决方法
这里有一些可能的问题:
>如果您希望在任意设备上实时执行此操作(与实验室设置相比),则需要遵循Jeffrey的建议,因为其他应用程序可能会消耗getTotalRxBytes()报告的带宽.
>这将测试此主机的下载速度.如果那是你要与“真实的东西”进行交流的主持人,那很酷.或者,如果您只是一般需要了解下载速度,那就没关系.但是测试站点A的下载速度并假设它对站点B是准确的将是不可靠的,因为站点A和站点B可能甚至不在同一个大陆上.
>如果您希望这么做,那么您正在测试的主机的所有者可能会因带宽费用,过多的日志条目等而受到轻微的不满.理想情况下,您只能针对您拥有的内容执行此操作.
>对于计量数据计划,200KB可能会激怒设备所有者.
>所有关于互联网访问的标准警告(例如,服务器可能已关闭)和移动设备(例如,用户可能从WiFi启动并移出范围,大幅改变您的下载能力)适用.
总而言之,进行下载是衡量下载速度的唯一真正方法.