DownloadManager - 了解ERROR_HTTP_DATA_ERROR

时间:2016-01-14 06:26:03

标签: android android-download-manager http-error

我的应用程序在很大程度上依赖于android DownloadManager组件来下载大小为3-10兆字节的文件。

当扩大规模(达到数百万次下载)时,大局显而易见:

由于ERROR_HTTP_DATA_ERROR

所有下载中约有50%失败

我从谷歌分析中获取此信息

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

  

在HTTP级别发生错误接收或处理数据时COLUMN_REASON的值。

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

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

如果有人能帮助我理解,那就太棒了:

  • 有没有办法从DownloadManager获取有关确切http错误的更多信息?
  • 下载管理器可以解决哪些最常见的情况ERROR_HTTP_DATA_ERROR

值得一提的另一点:虽然这个错误累积 - 用户连接到WIFI网络(我设置下载管理器只能通过wifi下载)

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

3 个答案:

答案 0 :(得分:9)

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

            case Downloads.Impl.STATUS_HTTP_DATA_ERROR:
            return ERROR_HTTP_DATA_ERROR;

android.provider.Downloads的状态在sourcefix suggested中使用DownloadManager类自己的常量进行了屏蔽:

public static final int STATUS_HTTP_DATA_ERROR = 495;

现在你必须找出导致HTTP错误495的原因。谷歌搜索了一下后,我发现这个错误响应代码只与Google有关,通常是在从Play商店下载应用程序时生成的。

{{3}}到Go to Settings - Apps- All- Download manager and Clear data.

因此,在我有限的研究结束时,我认为它是一个潜在的DownloadManager实现相关的问题,而不是一些网络或服务器问题,因为没有明确的解决方案/解决方法可用(我的朋友也遇到了类似的情况)你应该尝试其他替代方案。

答案 1 :(得分:6)

  

下载管理器可以触发ERROR_HTTP_DATA_ERROR最常见的情况是什么?

没有看到任何代码,它的猜测是有效的。 From the docs:

  

如果发生HTTP错误,这将保留RFC 2616中定义的HTTP状态代码。

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

  

在下载过程中网络断开怎么办?

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

"408"  ; Section 10.4.9: Request Time-out
  

在失败所有下载管理器重试尝试失败后是否也会触发ERROR_HTTP_DATA_ERROR错误?

可能。为了抛出这种类型的错误,应用程序需要在网站上与下载进行通信和/或尝试和/或完成下载时出现问题。

  

有没有办法从DownloadManager获取有关确切http错误的更多信息?

除了使用try和catch并在应用程序使用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的博客详细介绍了在线错误报告的设置和其他选项How to setup ACRA, an Android Application Crash Tracking system, on your own host Application Crash Reports on Android

这将意味着对您的应用进行更新,但无论如何,您都必须从它的声音中做到这一点。

答案 2 :(得分:2)

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

我将采取的措施来解决问题:

  1. 尝试查看服务器负载或服务器活动与下载失败次数之间是否存在任何关联。这有助于确定问题是否源自服务器。如果是这样 - 您可以增加服务器端的资源或尝试找到减少服务器负载的方法,以最大限度地减少与下载相关的问题。繁重的服务器负载或大量的并发下载可能会导致您遇到的问题(瓶颈,超时,服务器端的锁定资源等)。

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

    < / LI>

    我不得不说Yvette女士要求添加更多日志记录非常重要。我在我的所有应用程序中都这样做。一旦您发布有关该问题的更多信息,我们就能够明确指出问题并更快地解决问题。