我使用的是的AsyncTask下载文件时,用测量连接的下载速度的目的。 我想在5秒后停止下载,这样我可以检查下载的字节总数和计算速度。 下面是我使用(这被放置在doInBackground()方法中)的代码:
try{
InputStream is = new URL("http://www.domain.com/linux.iso").openStream();
byte[] buf = new byte[1024];
long startTime = System.nanoTime();
long limitTime = System.nanoTime();
long difference = 0;
while (difference < 5000000000){ /*5 billion nanoseconds = 5 seconds*/
is.read(buf);
limitTime = System.nanoTime();
difference = limitTime - startTime;
}
is.close();
}
catch(Exception e){
e.printStackTrace();
}
当连接到无线网络,这是工作的罚款。 所测量的速度是相当准确的,这需要精确至5秒的时间完成该测试。 当我移动到3G,不过,测试从10达15秒至完成(我注意到,速度较慢的连接时间越长完成)。
怎么会? 我猜测,操作系统正在等待读的回复()请求它发送的,但不能肯定。
你知道的方式,将5秒时盖的下载不管是什么?
提前致谢。
read()
肯定是阻塞调用。 但我认为这是具有等待小区的无线在手机上电到全功率的结果。
告诉肯定的一种方法是打开浏览器,冲浪到一个页面,该页面加载此之后,做你的测试。
有一个很有趣的谷歌IO谈谈小区的无线怎么坐在空闲/低功耗状态的大部分时间,今年和需要几秒钟的“热身”
我去看看我能找到的链接视频。
编辑:这里的视频:
http://www.youtube.com/watch?v=PwC1OlJo5VM
电池通话时间则在大约17:12
http://www.youtube.com/watch?v=PwC1OlJo5VM&feature=player_detailpage#t=1032s
斜坡上升为约2秒,它看起来像。
从文稿的幻灯片:
你需要单独时间计算和下载在不同的线程。 你是对的,因为这两者在同一个线程, limitTime = System.nanoTime();
当只会得到执行is.read(buf);
完成了
试试这个代码,让我知道,如果它的工作原理:
final InputStream is = new URL("http://www.domain.com/linux.iso").openStream();
byte[] buf = new byte[1024];
final byte[] buf = new byte[1024];
long startTime = System.nanoTime();
long limitTime = System.nanoTime();
long difference = 0;
ExecutorService executor = Executors.newCachedThreadPool();
Callable<Object> task = new Callable<Object>()
{
public Object call()
{
try
{
return is.read(buf);
}
catch(IOException e)
{
return null;
}
}
};
long endTime = 5000000000L;
while(difference < endTime)
{
Future<Object> future = executor.submit(task);
limitTime = System.nanoTime();
difference = limitTime - startTime;
try
{
if(future.get(endTime - difference, TimeUnit.NANOSECONDS) == null)
{
System.out.println("IOException is raised on read()!");
}
}
catch(TimeoutException ex)
{
System.out.println("TimeoutException is raised, because of the timeout!");
break;
}
catch(Exception e){}
finally
{
future.cancel(true);
}
}