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

Tal*_*nel 6 ssl https android android-download-manager

根据文档,如果由于http错误导致下载失败 - COLUMN_REASON应该保留特定的http错误代码.

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

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

有可能以某种方式得到这个http代码?

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

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

我希望这将是这样的广播.

我最终想要得到答案的问题是:

  • 是否可以在不查询下载管理器的情况下监听"下载暂停"事件,并且没有主动监听内容解析器?
  • 是下载管理器(API级别16+)支持https(ssl)?
  • 下载管理器重试策略究竟是什么?我可以更改默认重试政策吗?

Tim*_*Tim 11

有可能以某种方式得到这个http代码?

目前,没有.STATUS_SUCCESSFUL即使下载失败,DownloadManager 也会报告,例如因为找不到url /文件(HTTP 404)(这是一个错误).
另请参阅DownloadManager发送STATUS_SUCCESSFUL以进行失败下载

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


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

奇怪的是,没有.唯一可用的"事件"是: 在此输入图像描述

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

if (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) == DownloadManager.STATUS_PAUSED) {
    // Do stuff
}
Run Code Online (Sandbox Code Playgroud)

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

它曾经不支持https(在Android DownloadManager和SSL(https)中阅读更多内容),但现在它确实如此.例如,您可以通过尝试从https源检索文件来进行验证https://mdn.mozillademos.org/files/3794/mixed_content_webconsole.jpg.你会看到它检索文件很好.


下载管理器重试策略究竟是什么?我可以更改默认重试政策吗?

目前无法更改重试"政策".查看文档,您会发现没有关于此功能的方法或属性.

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

它指出:

下载管理器在放弃之前没有进展时重试其网络操作的次数.

public static final int MAX_RETRIES = 5;
Run Code Online (Sandbox Code Playgroud)

下载管理器接受带有delta-seconds参数的Retry-After响应头的最短时间.

public static final int MIN_RETRY_AFTER = 30; // 30s
Run Code Online (Sandbox Code Playgroud)

下载管理器接受带有delta-seconds参数的Retry-After响应头的最长时间.

public static final int MAX_RETRY_AFTER = 24 * 60 * 60; // 24h
Run Code Online (Sandbox Code Playgroud)

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


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

我可以建议一个替代方案:在https://github.com/Trinea/android-common上有一个android-common libary 的下载管理器 我自己没有使用它,但是github上的2k +星通常意味着它值得一试.