如何暂停或恢复Web呼叫(即文件下载)

时间:2012-09-18 12:34:49

标签: android web-services android-asynctask

我的应用程序有一个像我们调用的暂停或恢复一样的要求(下载文件)。在我的应用程序中,我需要按顺序或并行调用一组Urls,我必须花时间完成调用。它可以选择在调用URL时暂停和恢复。我怎样才能实现它。我尝试过Async Task但它没有暂停和恢复选项。如果有人有想法,请帮助我。

2 个答案:

答案 0 :(得分:2)

您无法暂停/恢复一个Web服务调用:HTTP协议根本不支持它。您可以尝试使用HTTP / 1.1保持活动连接,但这可能相当痛苦,我强烈建议不要这样做。相反,您应该做的是在URL调用之间暂停。也就是说,拨打一个电话,检索数据,然后转到下一个或暂停,然后再转到下一个。

您只需使用AsyncTask即可实现此目的。在您的类中声明一个boolean变量以保持运行状态(暂停/运行)和indicator成员变量类型Object - 您需要它来进行通知。

然后在你的doInBackground方法循环中,你的URL按顺序调用每一个。完成一个呼叫后,检查该变量。如果它被设置为false(即已调用pause),则等待它设置为true - 使用类似这样的内容:

for(each url in your list) {
    //make the call and retrieve the data
    ....
    if(!this.runState) { //pause has been called
        // the below code blocks until notified
        synchronized(indicator) {
            try {
                runState.wait();
            } catch (InterruptedException e) {
                // Nothing needs to be done here
            }
        }
    }
}

最后,您需要停止/恢复方法:

public synchronized void pause() {
    runState = false;
}

public synchronized void resume() {
    runState = true;
    //this code notifies the process (in the loop) to stop waiting
    synchronized(syncObject) {
        indicator.notify();
    }
}

<强>更新

如果您想使用HTTP停止和恢复文件下载,那么您需要做两件事。

  1. 手动处理来自连接的InputStream,一次读取1024个字节。记录您的总体阅读量。每次读取后检查是否未调用“暂停”。如果有,则等到“简历”被调用。

  2. 调用resume后,尝试继续读取流。如果服务器端已关闭流,则重新建立连接并使用Range HTTP标头指定偏移量,例如Range: bytes=4096-将请求服务器从流的字节4096开始继续传输。请注意,并非所有服务器都支持此标头。如果你的特定服务器没有,那你就不走运了。

  3. 实际的暂停/恢复/检查逻辑与上述相同。

答案 1 :(得分:0)

自从我查看HTTP协议*以来已经有一段时间了,但是你可以设置一个参数来指示输出流中的偏移量。这样您就可以从之前停止的位置“恢复”下载。显然,这需要服务器支持此功能。

*我也有可能与FTP协议混淆。