15

我有一个用例,其中,直到android下载管理器将通过下载参考ID给予下载状态?

我开始使用android下载管理器下载文件,并在中间关闭手机。当我再次重新启动时,下载继续并完成。我通过提供下载参考ID来获得状态。但是,即使在使用该参考ID的10天后,我也想知道该状态。

所以我的问题是,直到android下载管理器将通过下载参考ID给下载的状态?

我看着文档,并通过堆栈流过,但无法找到答案。有人帮助我。

+0

我有同样的问题......我的猜测是,只要用户没有从下载管理器应用中删除下载(通过长时间按下并删除),数据就可用。 – daramasala

回答

1

的Android DownloaderManager时,您可以获取ID后面是一个系统服务。它应该始终运行。但有些情况下无法运行。

下载通过HTTP持久连接发生。这意味着相同的连接被用于连续的HTTP请求/响应。连接中断意味着错误发生,因此,您不能通过引用id跟踪状态。

您通过Android跟踪DownloadManager服务,其中Android DownloadManager服务从服务器获取代码STATUS

Android DownloadManager使用基于content-length的服务器下载。 Content-Length标题将不允许流式传输(link)。基于内容长度的下载具有恢复,暂停,部分下载的优势 - 请参阅上面的链接1。因此,即使重新启动系统,它也会重新启动(增加)下载。

基于content-length的下载是store and forwardlink)。您应该将缓冲的内容转发到永久存储器,因为您的固定缓冲区有限。

Android DownloadManager has ERROR_CANNOT_RESUME int flag(link)。 ERROR_CANNOT_RESUME基于COLUMN_STATUS标志。有两种类型的列状态:STATUS_PAUSEDSTATUS_FAILED。在系统关闭之前,系统通过BroadcastReceiver发送关于关闭的Android DownloadManager服务。 Android DownloadManager然后激活STATUS_PAUSED标志。而且,当下次重启设备时,系统服务会自动运行,检查STATUS_PAUSED是否会再次开始下载。

答:所以直到发生错误(在客户端,连接或服务器端),或者你没有下载完的文件(这意味着直到STATUS_SUCCESSFUL),你不断从Android DownloadManager获取状态。发生时无法获得状态STATUS_FAILED - 表示下载不会重试(link)。

STATUS_FAILED如何发生? 客户的DownloadManager服务检测HTTP状态码4XX(服务器猜测客户端犯了错误)和5XX(服务器检测服务器犯了错误)(link),现在STATUS_FAILED变为真。

其他一些情况: 当客户保持关断和基于服务器的逻辑,服务器可以终止与连接超时的。所以,这个控件明确地基于不同的HTTP服务器。我们不能在这里问这么多天。我们不知道服务器端的逻辑。 status_codes基于服务器。当服务器决定客户端发生故障时,然后服务器执行服务器端的连接,使得STATUS_FAILED处于活动状态。客户端必须为TCP连接在任意时间消失做好准备,并且必须能够重新建立连接并重试HTTP请求。过早关闭的连接不应视为错误;如果尝试重新建立连接失败,则只会发出错误信号。 你的问题没有一个确切的答案。

注意TCP connections to disappear at arbitrary timeslink)是这里的主要逻辑是可以恢复一定数量关闭了设备的几天后您的连接。

1)在STATUS_FAILED上,您无法继续跟踪更多数据。

2)On如果COLUMN_STATUS既不是STATUS_FAILED也不是STATUS_PAUSED,此列的值是未定义的,在这里您可能无法跟踪更多数据。

- 除了上述两种情况以外的任何情况,正在下载。

+0

@ Gautam谢谢你的答案,我没有完全得到答案。我的问题是,考虑我开始下载并有下载参考ID,现在状态可能会变成STATUS_FAILED,STATUS_PAUSED,STATUS_SUCCESSFUL或Whatever。现在,直到有多少天或几个月,android系统会给出给定的下载参考ID的状态? –

+0

@三,我道歉,我现在明白了。每次下载都会持续覆盖这些ID。当状态成功并完成时,现在整个过程成为GC的一部分,Garbage Collection会根据您的系统在稍后删除这些变量。 –

+0

连接中断时也是如此。一旦连接失败(我不是说过早失败 - 再次阅读答案),这意味着永远失败。您无法再重新建立相同的连接。现在,整个堆操作再次由GC负责。 –

-2

您可以使用SharedPreferences存储您的下载参考ID。 事情是这样的 -

SharedPreferences settings = getSharedPreferences("DownloadIDS", 0); 
SharedPreferences.Editor editor = settings.edit(); 
editor.putLong("downloadIds", downloadID); 
editor.commit(); 

使用该

SharedPreferences downloadids = context.getSharedPreferences("DownloadIDS", 0); 
long savedDownloadIds = downloadids.getLong("downloadIds", 0); 
+0

感谢您的回答。这里我的问题不是关于存储下载参考ID我的问题是关于直到当android系统会给出给定的下载参考ID的状态? –

+1

请关注这个问题'所以我的问题是,当android下载管理器将通过下载参考ID给出下载的状态?' –

+0

我明白这个问题。但我正在给出一种解决方法,以不同的方式解决OP的问题。我认为这不值得赞扬。 –