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" 事件?
我希望会是这样的广播。
我希望最终得到答案的问题是:
- 是否可以在不不断查询下载管理器并且不主动监听内容解析器的情况下监听 "download pause" 事件?
- 下载管理器(API 级别 16+)是否支持 https (ssl)?
- 下载管理器重试策略到底是什么?我可以更改它的默认重试策略吗?
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+ 星通常意味着它值得一试。
根据 documentation,如果由于 http 错误导致下载失败 - COLUMN_REASON
应该包含特定的 http 错误代码。
我遇到的问题是,在实践中,下载失败时我看到的唯一原因值是 ERROR_HTTP_DATA_ERROR
此外,我在 logcat 中看到运行时实际失败的 http 代码,当下载停止并重试时,但我看不到任何从下载管理器获取它的方法。
是否可以通过某种方式获得此 http 代码?
我正在使用广播接收器来处理 ACTION_DOWNLOAD_COMPLETE
,但我没有看到任何方式来收听下载暂停,我感觉如果我查询下载管理器失败原因在它执行的重试尝试之间 - 然后我将获得实际状态代码。
是否可以在不不断查询下载管理器的情况下收听 "download pause" 事件?
我希望会是这样的广播。
我希望最终得到答案的问题是:
- 是否可以在不不断查询下载管理器并且不主动监听内容解析器的情况下监听 "download pause" 事件?
- 下载管理器(API 级别 16+)是否支持 https (ssl)?
- 下载管理器重试策略到底是什么?我可以更改它的默认重试策略吗?
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+ 星通常意味着它值得一试。