Dan*_*cco 8 java networking android 3g
我正在开发一个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();
}
Run Code Online (Sandbox Code Playgroud)
之后,我只需要将传输的字节数除以所用的时间,它将以bps为单位给出下载速度.
问题:1.这种方法是否准确?你知道一个更好的吗?
非常感谢.
这里有一些可能的问题:
如果您希望在任意设备上(相对于实验室设置)即时执行此操作,则需要遵循Jeffrey的建议,因为其他应用程序可能会消耗会报告的带宽getTotalRxBytes()。
这将测试从该主机下载的速度。如果您是与“真实材料”进行交流的主持人,那很酷。或者,如果您通常只需要下载速度的概念,那就可以了。但是,测试站点A的下载速度并假设站点B的准确性是不可靠的,因为站点A和站点B甚至可能不在同一大陆上。
如果您希望做很多事情,那么所测试主机的所有者可能会因带宽消耗,过多的日志条目等而感到有些恼火。理想情况下,您只会对自己拥有的东西这样做。
对于计量数据计划,200KB可能会激怒设备所有者。
有关Internet访问(例如,服务器可能已关闭)和移动设备(例如,用户可能开始使用WiFi并超出范围,彻底改变您的下载能力)的所有标准警告适用。
话虽如此,下载是衡量下载速度的唯一真正方法。