2016-01-14 3 views
11

Мое приложение сильно зависит от компонента android DownloadManager для загрузки файлов с приблизительным размером 3-10 мегабайт.DownloadManager - понимание ERROR_HTTP_DATA_ERROR

при расширении (до миллионов скачиваний) большая картина ясна:

~ 50% всех загрузок не удается из-за ERROR_HTTP_DATA_ERROR.

Я получаю информацию от Google Analytics

согласно документации, этот код ошибки означает:

Значение COLUMN_REASON когда ошибки приема или обработки данных происходит на уровне HTTP.

Я нашел эту документацию не очень информативной.
есть много ошибок HTTP.

а как насчет отключения сети в середине загрузки? также вызывает ошибку ERROR_HTTP_DATA_ERROR после отказа от попыток повторной попытки менеджера загрузки?

Было бы здорово, если бы кто-то может помочь мне понять:

  • есть ли способ, чтобы получить от DownloadManager получения более подробной информации о точной ошибке HTTP?
  • Каковы наиболее распространенные ситуации ERROR_HTTP_DATA_ERROR может быть уволен менеджером загрузки?

еще один момент, который стоит отметить: в то время как эта ошибка начислении - пользователь подключен к сети WiFi (я устанавливаю менеджер загрузки для загрузки только через Wi-Fi)

пожалуйста не предложите мне не использовать менеджер загрузки вообще. Я знаю об этом варианте, преимуществах и недостатках. Я сохраняю этот вариант как последнее средство.

+0

У вас есть какой-то выход logcat, захваченный этой ошибкой? –

+0

нет, я не знаю. потому что, поскольку я получаю эти ошибки от других пользователей с помощью аналитики google. –

+0

Да, я понимаю, надеялся, что у вас может быть несколько тестовых журналов. Я пишу ответ. –

ответ

4

Глядя на Source of DownloadManagerERROR_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 и часто создается при загрузке приложений из игрового магазина.

fix suggested к Go to Settings - Apps- All- Download manager and Clear data.

Итак, в заключение моего ограниченного исследования, я думаю, что его основополагающая проблема, связанная DownloadManager реализации, а затем некоторые из сети или сервера проблемы, и так как без определенного решения/обходной путь доступен (мои друзья тоже столкнулись с аналогичной ситуацией), вы должны попробовать другие альтернативы.

+0

В исходном коде (строка 435) я могу видеть, что этот код состояния может быть выброшен при IOException: https://android.googlesource.com/platform/packages/providers/DownloadProvider/+/master/src/ com/android/providers/downloads/DownloadThread.java –

+0

@downvoter, чтобы прокомментировать, что случилось с моим ответом? Это не полное решение, но я прилагал к нему свои усилия, чтобы хоть что-то получить. –

+0

Я тоже не понимаю, кто проголосовал и почему. –

6

Какие наиболее распространенные ситуации ERROR_HTTP_DATA_ERROR могут быть уволены менеджером загрузки?

Не видя никакого кода, это угадывает работу. From the docs:

Если произошла ошибка HTTP, это будет содержать код состояния HTTP, как определено в RFC 2616.

Это даст вам стандартную ошибку HTTP, из которого вы можете найти 6.1.1 Status Code and Reason Phrase. Если у вас есть миллионы загрузок, и это из-за ограниченного количества сайтов, это может быть проблемой, которая выходит за рамки вашего приложения, поскольку серверы веб-сайта могут не справляться с трафиком.

а как насчет отключения сети в середине загрузки?

Проблемы, связанные с подключением к Интернету;

"408" ; Section 10.4.9: Request Time-out 

делает это также вызывает ошибку ERROR_HTTP_DATA_ERROR после провала всех менеджер для скачивания в повторных попыток?

Возможно. Для того, чтобы он выдавал этот тип ошибки, он должен быть проблемой с приложением, которое связывается с и/или пытается и/или заканчивает загрузку на веб-сайте.

есть ли какой-либо способ получить от DownloadManager дополнительную информацию о точной ошибке HTTP?

Помимо использования попробовать и уловов и протоколирование ошибок в соответствующих методах, где ваше приложение использует 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.

Этот блог на сыроварню дает детальное представление о настройке и другие варианты онлайн-отчетов об ошибках How to setup ACRA, an Android Application Crash Tracking system, on your own host Application Crash Reports on Android

Это будет означать обновление для вашего приложения, но вы будете иметь, чтобы сделать это в любом случае из звуки этого.

+1

Хм, хорошее объяснение.goodjob – Mohsen

+1

@ LinX64 большое спасибо! : D –

2

Трудно точно сказать, в чем причина ошибки, которую вы получаете. Код ошибки, который вы получаете, является слишком общим.

Вещи, которые я бы сделать для того, чтобы решить эту проблему:

  1. Try, чтобы увидеть, есть ли какая-нибудь связь между нагрузкой сервера или активностью сервера и количеством сбоев загрузки. Это поможет определить, возникает ли проблема на сервере. Если это так - вы можете увеличить свои ресурсы на стороне сервера или попытаться найти способ уменьшить нагрузку на свои серверы, чтобы минимизировать проблемы, связанные с загрузкой. Тяжелые нагрузки на сервер или большое количество одновременных загрузок могут вызывать проблемы, подобные тем, которые у вас есть (бутылочные шейки, тайм-ауты, заблокированные ресурсы на стороне сервера и т. Д.).

  2. Если вы пришли к выводу, что ваша проблема на стороне клиента - я бы подумал о замене Android Download Manager другим или написать ваш выигранный код, чтобы загрузить файл (ы).

Я должен сказать, что предложение г-жи Иветт добавить больше регистрации важно. Я делаю это во всех своих приложениях. Как только вы разместите дополнительную информацию о проблеме, мы сможем выявить проблему и решить ее быстрее.