2015-09-20 39 views
4

根據documentation,如果由於http錯誤導致下載失敗 - COLUMN_REASON應該保存特定的http錯誤代碼。DownloadManager:瞭解重試策略和錯誤代碼

我遇到的問題是,在實踐中,唯一的原因值我看到當下載失敗是ERROR_HTTP_DATA_ERROR

也,我看到logcat中在運行時實際的故障HTTP代碼,被停止下載時並重新嘗試,但我沒有辦法從下載管理器中獲取它。

是否有可能以某種方式得到這個http代碼?

我正在使用廣播接收器來處理ACTION_DOWNLOAD_COMPLETE,但我沒有看到任何方式來聽下載暫停,並且我感覺如果我將在重試嘗試之間查詢下載管理器失敗原因它確實 - 然後我會得到實際的狀態碼。

是否可以在不查詢下載管理器的情況下收聽「下載暫停」事件?

我期望這樣的廣播。

的問題,我很樂意,最終得到的答案是:

  • ,纔有可能聽「下載暫停」事件,而不詢問不斷的下載管理器,並沒有主動偵聽器添加到內容解析?
  • 是下載管理器(API級別16+)支持https(ssl)?
  • 下載管理器重試策略究竟是什麼?我可以更改它的默認重試策略嗎?
+0

@TimCastelijns:同意,但給我一個休息......: - >這個問題其實對我更重要,那麼原來的問題 –

回答

8

是否有可能得到某種程度上這個http代碼?

目前,沒有。即使下載失敗,DownloadManager也會報告STATUS_SUCCESSFUL,例如因爲未找到url /文件(HTTP 404)(這是一個錯誤)。
另請參閱DownloadManager sends STATUS_SUCCESSFUL for failed download

我知道這是一個相對老的線程,但該問題仍然存在。我在5分鐘前測試了它,但它仍然無法正常工作。


,纔有可能聽「下載暫停」事件,而不經常查詢下載管理器?

奇怪的是,沒有。唯一可用的「事件」監聽是: enter image description here

爲了解決這個問題,必須通過檢查

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

查詢狀態自己每隔X時間下載管理器(在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 

正如你可能已經猜到了,這是最後的(常量),因此不能改變。


結論:下載管理器是做一些基本的下載非常有用的,但它的功能是相當有限。

我可以建議一種替代方案:有過在https://github.com/Trinea/android-common 我沒有用它自己,但2K在github +明星是在Android常見libary一個downloadmanager通常意味着它是值得一試。