在android上下载文件大于文件的大小

时间:2012-01-29 23:30:17

标签: android progress-bar download

我正在使用以下代码下载视频并维护进度条以显示已完成的下载量。

ByteArrayBuffer baf = new ByteArrayBuffer((int)filesize);
long current = 0;
long notificationSize = filesize / 100 * 5;
int notifyCount = 0;
while ((current = inStream.read()) != -1)
{
    baf.append((byte) current);
    count += current;

    //only process update once for each kb
    if(count > notificationSize * notifyCount)
    {
        notifier.processUpdate(count);
        notifyCount++;;
    }

}

我遇到的问题是从输入流返回的数据总计超过文件大小。这意味着我的进度条在下载完成之前完成。

例如,我下载的视频文件大小为1,849,655字节,但下载次数增加到228,932,955。

Android进度条使用完成过程的百分比。如果下载的总字节数超过文件大小,我怎么知道多少是完整的。

1 个答案:

答案 0 :(得分:0)

解决了这个问题。

下载并跟踪已下载的数据量时,请勿使用BufferedInputStream中的read()。

而是使用read(缓冲区,偏移量,长度);

我还改变了我的代码,将数据写入文件,而不是将数据存储在内存中,并在所有数据都关闭后输出。

byte[] baf = new byte[filesize];
int actual = 0;
int count = 0;
long notificationSize = filesize / 100 * 5;
int notifyCount = 0;
while (actual != -1)
{
    //write data to file
    fos.write(baf, 0, actual);
    count += actual;

    //only process update once for each kb
    if(count > notificationSize * notifyCount)
    {
        notifier.processUpdate(count);
        notifyCount++;;
    }
    actual = inStream.read(baf, 0, filesize);
}

我不确定为什么read()显示当read()一次只读取一个字节时它读取了多个字节。

如果你真的想使用read()更改

count += current;

count++;

这是一种相当低效的下载方式,因为while循环中的循环次数要大得多。经过一些简短的性能测试后,下载速度似乎也较慢(因为它需要为每个字节而不是一块字节写出文件)。