DownloadManager:了解重试策略和错误代码

DownloadManager: understand retry policy and error codes

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

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

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

是否可以通过某种方式获得此 http 代码?

我正在使用广播接收器来处理 ACTION_DOWNLOAD_COMPLETE ,但我没有看到任何方式来收听下载暂停,我感觉如果我查询下载管理器失败原因在它执行的重试尝试之间 - 然后我将获得实际状态代码。

是否可以在不不断查询下载管理器的情况下收听 "download pause" 事件?

我希望会是这样的广播。

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

is it possible to get somehow this http code?

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

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


is it possible to listen to "download pause" event without querying constantly the download manager?

奇怪的是,没有。唯一可用的 "events" 监听是:

要解决这个问题,您必须每 X 次通过检查

自己查询状态
if (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_PAUSED) {
    // Do stuff
}

is download manager (on API level 16+) supports https (ssl) ?

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


what exactly is download manager retry policy? can I change it default retry policy?

目前无法更改重试 'policy'。请参阅 the docs,您会发现没有关于此功能的方法或属性。

关于默认的重试策略,可以在下面的包中找到有用的信息: com.android.providers.downloads.Constants. This links to the 5.1.1 version, if you need the information for another version you can manually navigate to that. For example here是android4.0.1的信息(重试策略值与5.1相同。 1).

它指出:

The number of times that the download manager will retry its network operations when no progress is happening before it gives up.

public static final int MAX_RETRIES = 5;

The minimum amount of time that the download manager accepts for a Retry-After response header with a parameter in delta-seconds.

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

The maximum amount of time that the download manager accepts for a Retry-After response header with a parameter in delta-seconds.

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

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


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

我可以建议一个替代方案:有一个 downloadmanager in the android-common libary over at https://github.com/Trinea/android-common 我自己没有使用过它,但是 github 上的 2k+ 星通常意味着它值得一试。