0

我的应用程序有暂停或恢复我们调用的要求(下载文件)。在我的应用程序中,我需要按顺序或并行调用一组 URL,并且我必须花时间来完成调用。它具有在调用 url 时暂停和恢复的选项。我怎样才能实现它。我尝试了异步任务,但它没有暂停和恢复选项。如果有人有想法,请帮助我。

4

2 回答 2

2

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

您可以简单地使用AsyncTask. 在你的类中声明一个boolean变量来保持运行状态(暂停/运行)和一个indicator类型的成员变量Object——你需要它来通知。

然后在您的doInBackground方法中循环遍历您的 URL 依次调用每一个。完成一次通话后,检查该变量。如果它设置为falsepause即已被调用),则等到它设置为 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 后,尝试继续读取流。如果流已被服务器端关闭,则重新建立连接并使用RangeHTTP 头指定偏移量,例如Range: bytes=4096-将请求服务器从流的 4096 字节开始继续传输。请注意,并非所有服务器都支持此标头。如果您的特定服务器没有,那么您就不走运了。

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

于 2012-09-18T13:45:39.507 回答
0

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

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

于 2012-09-18T15:03:49.567 回答