下载管理器 - 了解 ERROR_HTTP_DATA_ERROR

DownloadManager - understanding ERROR_HTTP_DATA_ERROR

我的应用程序严重依赖 android DownloadManager 组件来下载大约 3-10 兆字节的文件。

扩大规模(到数百万次下载)时,大局很清楚:

~50% 的下载失败 由于 ERROR_HTTP_DATA_ERROR

我从 google 分析中获取此信息

根据文档,此错误代码代表:

Value of COLUMN_REASON when an error receiving or processing data occurred at the HTTP level.

我发现此文档的信息量不大。
那里有很多 http 错误。

还有下载中途断网怎么办?在所有下载管理器重试失败后,它是否也会触发 ERROR_HTTP_DATA_ERROR 错误?

如果有人能帮助我理解就太好了:

另一点值得一提:虽然这个错误不断增加 - 用户已连接到 WIFI 网络(我将下载管理器设置为仅通过 wifi 下载)

请不要建议我完全不要使用下载管理器。我知道这个选项,优点和缺点。我将此选项保存为最后的手段。

what are the most common situations ERROR_HTTP_DATA_ERROR can be fired by download manager?

没有看到任何代码就可以猜测了。 From the docs:

If an HTTP error occurred, this will hold the HTTP status code as defined in RFC 2616.

这会给你一个标准的 http 错误,你可以从中找到 6.1.1 Status Code and Reason Phrase。如果您有数百万次下载,并且这些下载来自有限的网站,这可能是您的应用程序之外的问题,因为网站的服务器可能无法处理流量。

and what about network disconnection in the middle of the download?

互联网连接问题可能导致;

"408"  ; Section 10.4.9: Request Time-out

does it also triggers the ERROR_HTTP_DATA_ERROR error after failing all the download's manager retry attempts?

可能吧。要引发此类错误,必须是与 and/or 尝试 and/or 完成网站下载的应用通信存在问题。

is there any way to get from DownloadManager more information about the exact http error?

除了在您的应用程序使用 DownloadManager 的相关方法中使用 try 和 catches 并记录错误,然后在收到此错误时测试并等待 logcat,另一个选项将是远程使用库或第三方工具来获取已部署应用程序的远程错误日志记录和崩溃报告。

有许多第三方服务和库提供此功能,我以其中一个著名的开源库为例。

至于在线错误和崩溃日志记录,ACRA 是开源的并提供此功能。这曾经使用 Google 产品来自由存储报告,但随着使用量的增加,Google 已撤消此支持,但是有 ACRA 和其他提供商提供的功能,或者您可以管理自己的报告,但这可能会产生费用。

通过扩展应用程序 class 并与应用程序一起启动,创建一个 class 挂接到您的应用程序,从而在应用程序代码中实现这一点相对简单。

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

上的应用程序崩溃报告

这将意味着对您的应用程序进行更新,但从它的声音来看,您无论如何都必须这样做。

很难准确地说出您收到错误的原因。您收到的错误代码过于笼统。

为了解决问题我会做的事情:

  1. 试试服务器负载或者服务器activity和下载失败次数有没有关系。这将有助于确定问题是否源自服务器。如果是这样 - 您可以增加服务器端的资源或尝试找到一种方法来减少服务器上的负载以最大限度地减少与下载相关的问题。繁重的服务器负载或大量并发下载可能会导致您遇到的问题(bottle-necks、超时、服务器端资源锁定等)。

  2. 如果您得出的结论是您的问题出在客户端 - 我会考虑用另一个替换 Android 下载管理器或编写您的获胜代码来下载文件 ( s).

我不得不说 Yvette 女士提出的增加更多日志记录的提议很重要。我在我所有的应用程序中都这样做。一旦您 post 有关问题的更多信息 - 我们将能够 pin-point 问题并更快地解决它。

查看 Source of DownloadManager ERROR_HTTP_DATA_ERROR 是由方法返回的 getErrorCode(int) 这是确切的行:

            case Downloads.Impl.STATUS_HTTP_DATA_ERROR:
            return ERROR_HTTP_DATA_ERROR;

android.provider.Downloads 的状态在这里被 DownloadManager class 自己的常量屏蔽,在其 source:

public static final int STATUS_HTTP_DATA_ERROR = 495;

现在您必须找出导致 HTTP 错误的原因 495。在谷歌搜索了一下后,我发现这个错误响应代码仅与 Google 相关,并且经常在从 Playstore 下载应用程序时产生。

一个fix suggestedGo to Settings - Apps- All- Download manager and Clear data.

所以根据我有限的研究,我认为它是一个潜在的 DownloadManager 实现相关问题,而不是一些网络或服务器问题,并且由于没有明确的 solution/workaround 可用(我的朋友也面临类似情况)你应该尝试其他选择。