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