DownloadManager - понимание ERROR_HTTP_DATA_ERROR
Мое приложение сильно зависит от компонента android DownloadManager
для загрузки файлов с приблизительным размером 3-10 мегабайт.
при масштабировании (до миллионов загрузок) большая картина понятна:
~ 50% всех загрузок не работают из-за ERROR_HTTP_DATA_ERROR.
Я получаю эту информацию из Google Analytics
в соответствии с документацией, этот код ошибки означает:
Значение COLUMN_REASON, когда ошибка при получении или обработке данных произошла на уровне HTTP.
Я нашел эту документацию не очень информативной.
есть много ошибок HTTP.
и как насчет отключения сети в середине загрузки? вызывает ли это также ошибку ERROR_HTTP_DATA_ERROR
после отказа от попыток повторной попытки диспетчера загрузки?
Было бы здорово, если бы кто-то помог мне понять:
- есть ли способ получить от
DownloadManager
больше информации о точной ошибке HTTP?
- Каковы наиболее распространенные ситуации
ERROR_HTTP_DATA_ERROR
могут быть запущены менеджером загрузки?
еще один момент, который стоит упомянуть: в то время как эти ошибки возникают - пользователь подключен к сети WIFI (я устанавливаю диспетчер загрузки для загрузки только через Wi-Fi)
пожалуйста, не предлагайте мне вообще не использовать диспетчер загрузки. Я знаю об этом варианте, преимуществах и недостатках. Я сохраняю этот вариант в качестве крайней меры.
Ответы
Ответ 1
Глядя на Источник DownloadManager ERROR_HTTP_DATA_ERROR
возвращается методом getErrorCode(int)
, это точная строка:
case Downloads.Impl.STATUS_HTTP_DATA_ERROR:
return ERROR_HTTP_DATA_ERROR;
android.provider.Downloads
имеет статусы, которые здесь маскируются с помощью собственных констант класса DownloadManager
, в source:
public static final int STATUS_HTTP_DATA_ERROR = 495;
Теперь вам нужно выяснить, что вызывает ошибку HTTP 495
. После Googling я пришел узнать, что этот код ответа на ошибку относится только к Google и часто возникает при загрузке приложений из игрового магазина.
A исправлено до Go to Settings - Apps- All- Download manager and Clear data.
Итак, в заключение моего ограниченного исследования, я думаю, что это основная проблема, связанная с реализацией DownloadManager
, а не какая-то проблема с сетью или сервером, и поскольку нет определенного решения/обходного пути (мои друзья также столкнулись с подобной ситуацией), вы должны попробуйте другие варианты.
Ответ 2
какие наиболее распространенные ситуации ERROR_HTTP_DATA_ERROR могут быть запущены менеджером загрузки?
Не видя никакого кода, он угадывает работу. Из документов:
Если возникла ошибка HTTP, это будет содержать код состояния HTTP, как определено в RFC 2616.
Это даст вам стандартную ошибку HTTP, из которой вы можете найти 6.1.1 код состояния и фразу разума. Если у вас есть миллионы загрузок, и это из-за ограниченного количества сайтов, это может быть проблемой, которая выходит за пределы вашего приложения, поскольку серверы веб-сайта могут не справляться с трафиком.
и как насчет отключения сети в середине загрузки?
Проблемы с подключением к Интернету могут вызвать:
"408" ; Section 10.4.9: Request Time-out
также вызывает ошибку ERROR_HTTP_DATA_ERROR после отказа от попыток повторной попытки диспетчера загрузки?
Возможно. Для того, чтобы он выдавал этот тип ошибок, он должен быть проблемой с приложением, которое связывается с и/или пытается и/или заканчивает загрузку на веб-сайте.
есть ли какой-либо способ получить от DownloadManager больше информации о точной ошибке HTTP?
Помимо использования try и уловов и регистрации ошибок в соответствующих методах, где ваше приложение использует DownloadManager
, а затем тестирование и ожидание logcat при получении этой ошибки, другим вариантом будет удаленное использование библиотеки или сторонний инструмент для получения удаленных журналов ошибок и отчетов о сбоях вашего развернутого приложения.
Есть много сторонних служб и библиотек, которые предлагают это, я использую одну из авторитетных библиотек с открытым исходным кодом в качестве примера.
Что касается онлайн-регистрации ошибок и сбоев, ACRA является открытым исходным кодом и предоставляет эту функцию. Это использовало для использования продуктов Google для свободного хранения отчетов, но по мере увеличения использования Google отменила эту поддержку, однако есть функции, предлагаемые ACRA и другими поставщиками, или вы можете управлять своей собственной отчетностью, но это может повлечь за собой расходы.
Реализация этого в коде приложения относительно проста, создавая класс, который подключается к вашему приложению, расширяя класс приложения и запуская его с помощью приложения.
import org.acra.*;
import org.acra.annotation.*;
@ReportsCrashes(
formUri = "http://www.backendofyourchoice.com/reportpath"
)
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// The following line triggers the initialization of ACRA
ACRA.init(this);
}
}
Вам также нужно будет настроить отчет о завершении работы, а также подробные сведения о том, как это сделать, по мере увеличения параметров. Более подробную информацию можно найти здесь, BasicSetup.
Этот блог от The Cheese Factory дает подробный обзор настроек и других параметров для отчетов об ошибках в Интернете Как настроить ACRA, систему отслеживания сбоев приложений для Android, самостоятельно хозяин
Отчеты о сбоях приложений на Android
Это будет означать обновление вашего приложения, но вам все равно придется делать это из его звуков.
Ответ 3
Трудно точно сказать, в чем причина ошибки, которую вы получаете. Код ошибки, который вы получаете, является слишком общим.
Вещи, которые я сделал бы, чтобы решить проблему:
-
Попробуйте выяснить, существует ли какая-либо корреляция между нагрузкой сервера или активностью сервера и количеством сбоев загрузки. Это поможет определить, возникает ли проблема на сервере. Если это так - вы можете увеличить свои ресурсы на стороне сервера или попытаться найти способ уменьшить нагрузку на свои серверы, чтобы минимизировать проблемы, связанные с загрузкой. Тяжелые нагрузки на сервер или большое количество одновременных загрузок могут вызывать проблемы, подобные тем, которые у вас есть (бутылочные шейки, таймауты, заблокированные ресурсы на стороне сервера и т.д.).
-
Если вы придете к выводу, что ваша проблема на стороне клиента - я бы подумал о замене Android Download Manager другим или записать ваш выигранный код, чтобы загрузить файл (ы).
Я должен сказать, что госпожа Иветт предлагает добавить больше протоколирования. Я делаю это во всех своих приложениях. Как только вы разместите дополнительную информацию о проблеме, мы сможем выявить проблему и решить ее быстрее.