15

我有一個用例,其中,直到android下載管理器將通過下載參考ID給予下載狀態?

我開始使用android下載管理器下載文件,並在中間關閉手機。當我再次重新啓動時,下載繼續並完成。我通過提供下載參考ID來獲得狀態。但是,即使在使用該參考ID的10天后,我也想知道該狀態。

所以我的問題是,直到android下載管理器將通過下載參考ID給下載的狀態?

我看着文檔,並通過堆棧流過,但無法找到答案。有人幫助我。

+0

我有同樣的問題......我的猜測是,只要用戶沒有從下載管理器應用中刪除下載(通過長時間按下並刪除),數據就可用。 – daramasala

回答

1

的Android DownloaderManager時,您可以獲取ID後面是一個系統服務。它應該始終運行。但有些情況下無法運行。

下載通過HTTP持久連接發生。這意味着相同的連接被用於連續的HTTP請求/響應。連接中斷意味着錯誤發生,因此,您不能通過引用id跟蹤狀態。

您通過Android跟蹤DownloadManager服務,其中Android DownloadManager服務從服務器獲取代碼STATUS

Android DownloadManager使用基於content-length的服務器下載。 Content-Length標題將不允許流式傳輸(link)。基於內容長度的下載具有恢復,暫停,部分下載的優勢 - 請參閱上面的鏈接1。因此,即使重新啓動系統,它也會重新啓動(增加)下載。

基於content-length的下載是store and forwardlink)。您應該將緩衝的內容轉發到永久存儲器,因爲您的固定緩衝區有限。

Android DownloadManager has ERROR_CANNOT_RESUME int flag(link)。 ERROR_CANNOT_RESUME基於COLUMN_STATUS標誌。有兩種類型的列狀態:STATUS_PAUSEDSTATUS_FAILED。在系統關閉之前,系統通過BroadcastReceiver發送關於關閉的Android DownloadManager服務。 Android DownloadManager然後激活STATUS_PAUSED標誌。而且,當下次重啓設備時,系統服務會自動運行,檢查STATUS_PAUSED是否會再次開始下載。

答:所以直到發生錯誤(在客戶端,連接或服務器端),或者你沒有下載完的文件(這意味着直到STATUS_SUCCESSFUL),你不斷從Android DownloadManager獲取狀態。發生時無法獲得狀態STATUS_FAILED - 表示下載不會重試(link)。

STATUS_FAILED如何發生? 客戶的DownloadManager服務檢測HTTP狀態碼4XX(服務器猜測客戶端犯了錯誤)和5XX(服務器檢測服務器犯了錯誤)(link),現在STATUS_FAILED變爲真。

其他一些情況: 當客戶保持關斷和基於服務器的邏輯,服務器可以終止與連接超時的。所以,這個控件明確地基於不同的HTTP服務器。我們不能在這裏問這麼多天。我們不知道服務器端的邏輯。 status_codes基於服務器。當服務器決定客戶端發生故障時,然後服務器執行服務器端的連接,使得STATUS_FAILED處於活動狀態。客戶端必須爲TCP連接在任意時間消失做好準備,並且必須能夠重新建立連接並重試HTTP請求。過早關閉的連接不應視爲錯誤;如果嘗試重新建立連接失敗,則只會發出錯誤信號。 你的問題沒有一個確切的答案。

注意TCP connections to disappear at arbitrary timeslink)是這裏的主要邏輯是可以恢復一定數量關閉了設備的幾天後您的連接。

1)在STATUS_FAILED上,您無法繼續跟蹤更多數據。

2)On如果COLUMN_STATUS既不是STATUS_FAILED也不是STATUS_PAUSED,此列的值是未定義的,在這裏您可能無法跟蹤更多數據。

- 除了上述兩種情況以外的任何情況,正在下載。

+0

@ Gautam謝謝你的答案,我沒有完全得到答案。我的問題是,考慮我開始下載並有下載參考ID,現在狀態可能會變成STATUS_FAILED,STATUS_PAUSED,STATUS_SUCCESSFUL或Whatever。現在,直到有多少天或幾個月,android系統會給出給定的下載參考ID的狀態? –

+0

@三,我道歉,我現在明白了。每次下載都會持續覆蓋這些ID。當狀態成功並完成時,現在整個過程成爲GC的一部分,Garbage Collection會根據您的系統在稍後刪除這些變量。 –

+0

連接中斷時也是如此。一旦連接失敗(我不是說過早失敗 - 再次閱讀答案),這意味着永遠失敗。您無法再重新建立相同的連接。現在,整個堆操作再次由GC負責。 –

-2

您可以使用SharedPreferences存儲您的下載參考ID。 事情是這樣的 -

SharedPreferences settings = getSharedPreferences("DownloadIDS", 0); 
SharedPreferences.Editor editor = settings.edit(); 
editor.putLong("downloadIds", downloadID); 
editor.commit(); 

使用該

SharedPreferences downloadids = context.getSharedPreferences("DownloadIDS", 0); 
long savedDownloadIds = downloadids.getLong("downloadIds", 0); 
+0

感謝您的回答。這裏我的問題不是關於存儲下載參考ID我的問題是關於直到當android系統會給出給定的下載參考ID的狀態? –

+1

請關注這個問題'所以我的問題是,當android下載管理器將通過下載參考ID給出下載的狀態?' –

+0

我明白這個問題。但我正在給出一種解決方法,以不同的方式解決OP的問題。我認爲這不值得讚揚。 –