【问题标题】:Detecting File Download Completion Status on Android在 Android 上检测文件下载完成状态
【发布时间】:2012-07-25 20:48:14
【问题描述】:

我正在使用以下代码从服务器下载文件

conn=url.openConnection();
bytesTotal=conn.getContentLength();    
in= new BufferedReader(new InputStreamReader(conn.getInputStream()));

while (true){
    byteFromStream=in.read(buffer);
    if (byteFromStream==-1) break;
    bytesLoaded=bytesLoaded+byteFromStream;
}

所以我基本上是在计算下载的字节数并将其与 bytesTotal 匹配。

最后,如果 bytesTotoal 与 bytesLoaded 不同,我是说下载状态不完整。

问题是文件大小为 12 KB,我的成功率很高,但文件大小较高时,状态总是不完整。

他们是否有任何其他方式可以确定我的下载状态。

【问题讨论】:

    标签: java android io


    【解决方案1】:

    也许你被这个打击了(引自 HttpURLConnection 文档):

    默认情况下,此 HttpURLConnection 实现请求服务器使用 gzip 压缩。由于 getContentLength() 返回传输的字节数,因此您无法使用该方法预测可以从 getInputStream() 读取多少字节。相反,读取该流直到它耗尽:当 read() 返回 -1 时。可以通过在请求标头中设置可接受的编码来禁用 Gzip 压缩:

    urlConnection.setRequestProperty("Accept-Encoding", "identity");

    【讨论】:

    • 源代码目前确实检查“当read()返回-1时”,因此包含这部分引用没有帮助。
    • @Carl:这对我来说似乎是主要的吹毛求疵。我的答案的一个更大的缺陷是它只与 HttpURLConnection 相关,而 OP 似乎使用的是普通的 URLConnection。但如果某些文件的长度未知,getContentLength 可能会为他尝试下载的一些文件返回 -1,在这种情况下,与 bytesLoaded 进行比较时,他显然会得到不匹配。
    • 我同意这是吹毛求疵。不过看了问题再看了你的回答,我以为问题的答案是检查read()的返回值,回头看问题时很惊讶。
    • 实际上我总是得到文件大小。一个大红灯是它最终总是少下载数千字节。例如,对于 1k KB,我最终会得到大约 7k KB。
    • 您能够从这些文件中下载的数据看起来是否正常?连接的 getContentEncoding() 给你什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 2013-01-25
    • 2013-09-11
    • 2023-03-26
    • 2020-07-11
    • 1970-01-01
    • 2013-06-28
    相关资源
    最近更新 更多