我的应用程序有暂停或恢复我们调用的要求(下载文件)。在我的应用程序中,我需要按顺序或并行调用一组 URL,并且我必须花时间来完成调用。它具有在调用 url 时暂停和恢复的选项。我怎样才能实现它。我尝试了异步任务,但它没有暂停和恢复选项。如果有人有想法,请帮助我。
2 回答
您不能暂停/恢复一个 Web 服务调用:HTTP 协议根本不支持它。您可以尝试使用 HTTP/1.1 keep-alive 连接,但这可能会很痛苦,我强烈建议您不要这样做。相反,您应该在 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 停止和恢复文件下载,那么您需要做两件事。
手动处理来自连接的 InputStream,例如一次读取 1024 个字节。跟踪您总共阅读了多少。每次阅读后,检查是否没有调用“暂停”。如果有,则等到“恢复”被调用。
调用 resume 后,尝试继续读取流。如果流已被服务器端关闭,则重新建立连接并使用
Range
HTTP 头指定偏移量,例如Range: bytes=4096-
将请求服务器从流的 4096 字节开始继续传输。请注意,并非所有服务器都支持此标头。如果您的特定服务器没有,那么您就不走运了。
实际的暂停/恢复/检查逻辑将与上述相同。
自从我查看 HTTP 协议* 以来已经有一段时间了,但是 iirc 您可以设置一个参数来指示输出流中的偏移量。这将让您从之前停止的位置“恢复”下载。显然,这需要服务器支持该功能。
*我也有可能与 FTP 协议混淆。