安卓/ Java的:如何阻止下载5秒后?(Android/Java: How To Stop Dow

2019-09-22 08:26发布

我使用的是的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秒时盖的下载不管是什么?

提前致谢。

Answer 1:

read()肯定是阻塞调用。 但我认为这是具有等待小区的无线在手机上电到全功率的结果。

告诉肯定的一种方法是打开浏览器,冲浪到一个页面,该页面加载此之后,做你的测试。

有一个很有趣的谷歌IO谈谈小区的无线怎么坐在空闲/低功耗状态的大部分时间,今年和需要几秒钟的“热身”

我去看看我能找到的链接视频。

编辑:这里的视频:

http://www.youtube.com/watch?v=PwC1OlJo5VM

电池通话时间则在大约17:12

http://www.youtube.com/watch?v=PwC1OlJo5VM&feature=player_detailpage#t=1032s

斜坡上升为约2秒,它看起来像。

从文稿的幻灯片:



Answer 2:

你需要单独时间计算和下载在不同的线程。 你是对的,因为这两者在同一个线程, limitTime = System.nanoTime(); 当只会得到执行is.read(buf); 完成了



Answer 3:

试试这个代码,让我知道,如果它的工作原理:

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


文章来源: Android/Java: How To Stop Download After 5 Seconds?