【问题标题】:DownloadManager: understand retry policy and error codesDownloadManager:了解重试策略和错误代码
【发布时间】:2015-12-17 00:54:20
【问题描述】:

根据documentation,如果由于http错误导致下载失败-COLUMN_REASON应该保存特定的http错误代码。

我遇到的问题是,在实践中,下载失败时我看到的唯一原因值是ERROR_HTTP_DATA_ERROR

另外,当下载停止并重试时,我在 logcat 中看到了运行时实际失败的 http 代码,但我没有看到任何从下载管理器获取它的方法。

是否有可能以某种方式获得此 http 代码?

我正在使用广播接收器来处理 ACTION_DOWNLOAD_COMPLETE ,但我没有看到任何方法可以收听暂停的下载,并且我感觉如果我在重试尝试之间查询下载管理器失败原因确实如此 - 然后我会得到实际的状态码。

是否可以在不不断查询下载管理器的情况下收听“下载暂停”事件?

我希望会是这样的广播。

我希望最终得到答案的问题是:

  • 是否可以在不不断查询下载管理器且不主动监听内容解析器的情况下监听“下载暂停”事件?
  • 下载管理器(API 级别 16+)是否支持 https (ssl)?
  • 下载管理器重试策略到底是什么?我可以更改它的默认重试策略吗?

【问题讨论】:

  • @TimCastelijns:同意,但是让我休息一下...... :-> 这个问题对我来说实际上比原来的问题更重要

标签: android ssl https android-download-manager


【解决方案1】:

是否有可能以某种方式获得此 http 代码?

目前,没有。即使下载失败,DownloadManager 也会报告 STATUS_SUCCESSFUL,例如因为找不到 url/文件 (HTTP 404)(这是一个错误)。
另见DownloadManager sends STATUS_SUCCESSFUL for failed download

我知道这是一个相对较旧的线程,但这个问题仍然存在。我在 5 分钟前测试了它,它仍然无法正常工作。


是否可以在不不断查询下载管理器的情况下收听“下载暂停”事件?

奇怪的是,没有。唯一可用的“事件”监听是:

要解决此问题,您必须每 X 次通过检查自己查询状态

if (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_PAUSED) {
    // Do stuff
}

下载管理器(API 级别 16+)是否支持 https (ssl)?

它过去不支持 https(在Android DownloadManager and SSL (https) 中阅读更多内容),但现在支持。您可以通过尝试从 https 源检索文件来简单地进行验证,例如 https://mdn.mozillademos.org/files/3794/mixed_content_webconsole.jpg。您会看到它可以正常检索文件。


下载管理器重试策略到底是什么?我可以更改它的默认重试策略吗?

目前无法更改重试“策略”。查看the docs,您会发现没有关于此功能的方法或属性。

关于默认重试策略,可以在以下包中找到有用的信息:com.android.providers.downloads.Constants。这链接到 5.1.1 版本,如果您需要其他版本的信息,您可以手动导航到该版本。例如here是android 4.0.1的信息(重试策略值与5.1.1相同)。

它说:

下载管理器在放弃之前在没有任何进展的情况下重试其网络操作的次数。

public static final int MAX_RETRIES = 5;

下载管理器接受 Retry-After 响应标头的最短时间,参数以 delta-seconds 为单位。

public static final int MIN_RETRY_AFTER = 30; // 30s

下载管理器接受 Retry-After 响应标头的最长时间,参数以 delta-seconds 为单位。

public static final int MAX_RETRY_AFTER = 24 * 60 * 60; // 24h

正如您可能已经猜到的那样,这些是最终的(常量),因此无法更改。


结论:DownloadManager 对于一些基本的下载非常有用,但它的功能非常有限。

我可以建议一个替代方案:在https://github.com/Trinea/android-commonhttps://github.com/Trinea/android-common 的 android-common 库中有一个 downloadmanager 我自己没用过,但是github上2k+的star通常意味着值得一试。

【讨论】:

  • 它仍然给出 STATUS_SUCCESSFUL,而该 url 上没有文件(错误 404)。还是bug吗?
猜你喜欢
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-27
  • 2020-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多