Ответ 1
Android DownloaderManager
- это системная служба. Предполагается, что он работает всегда. Но есть случаи, когда он не может работать.
Загрузка происходит через постоянное соединение HTTP. Это означает, что одно и то же установленное соединение используется для последовательного HTTP-запроса/ответа. Ошибка соединения означает, что происходит ошибка, и, таким образом, вы не можете отслеживать статус по идентификатору ссылки.
Вы отслеживаете службу Android DownloadManager
, где служба Android DownloadManager
получает код STATUS
с сервера.
Android DownloadManager использует загрузку content-length
с сервера. Заголовок content-length
не позволяет передавать потоки (ссылка). Загрузка на основе длины контента имеет преимущество возобновления, паузы, частичной загрузки - см. Ссылку1 выше. Таким образом, даже когда вы перезагружаете систему, она снова перезапускает (увеличивает) загрузку.
Загрузка content-length
составляет store and forward
(ссылка). Вы должны пересылать буферный контент в постоянное хранилище, потому что у вас ограниченные фиксированные буферы.
Android DownloadManager
имеет флаг ERROR_CANNOT_RESUME int
(ссылка). ERROR_CANNOT_RESUME
основан на знаке COLUMN_STATUS
. Существует два типа СОСТОЯНИЯ КОЛОННЫ: STATUS_PAUSED
или STATUS_FAILED
. Перед отключением системы система через BroadcastReceiver
отправляет службу Android DownloadManager
об отключении. Затем Android DownloadManager
активирует флаг STATUS_PAUSED
. И когда в следующий раз при перезагрузке устройства системная служба запускается автоматически, проверяет, запускает ли STATUS_PAUSED снова загрузку.
Ответ:, пока не произойдет ошибка (на стороне клиента, на сервере или на стороне сервера), или вы не закончили загрузку файла (это означает, что до STATUS_SUCCESSFUL
), вы продолжаете получать статус от Android DownloadManager
. Вы не можете получить статус, когда произойдет STATUS_FAILED
- он говорит, что загрузка не будет повторена (ссылка).
Как происходит STATUS_FAILED
?
Клиент DownloadManager
обнаруживает код состояния HTTP 4XX (сервер догадывается, что клиент ошибается) и 5XX (сервер обнаруживает, что сервер ошибается) (ссылка), теперь STATUS_FAILED
становится истинным.
Некоторые другие ситуации:
Когда клиенты остаются выключенными и на основе серверной логики, сервер может завершить соединение с таймаутом. Таким образом, этот элемент управления явно основан на разных HTTP-серверах. Мы не можем просить эти много дней здесь. Мы не знаем логики на стороне сервера. Статусные коды основаны на сервере. Когда сервер решает, что клиент потерпел неудачу, а затем сервер timeout
делает соединение STATUS_FAILED
активным на стороне сервера. клиенты должны быть готовы к тому, что соединения TCP исчезнут в произвольные моменты времени и должны иметь возможность восстановить соединение и повторить запрос HTTP. Преждевременно закрытое соединение не должно рассматриваться как ошибка; ошибка будет указана только в случае сбоя попытки восстановить соединение.
В вашем вопросе нет точного ответа.
Примечание: TCP connections to disappear at arbitrary times
(ссылка) является основной логикой здесь, которая может возобновить ваше соединение после определенное количество дней вашего устройства отключено.
1) На STATUS_FAILED
вы не можете продолжать отслеживать дальнейшие данные.
2) Вкл. Если COLUMN_STATUS
не является ни STATUS_FAILED
, ни STATUS_PAUSED
, это значение столбца undefined, здесь вы не сможете отслеживать дальнейшие данные.
- все, кроме выше двух условий, выполняется загрузка.