2012-01-29 110 views
0

我正在使用下面的代码下载视频,并维护一个进度条来显示下载已完成的程度。在Android上下载文件大于文件大小

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进度条使用完成过程的百分比。如果下载的总字节数超过文件的大小,我怎么知道完成了多少?

+0

你如何分配文件大小的值? – 2012-01-29 23:47:52

+0

我正在通过两种方法来确保我的尺寸合适。大小是在RSS源中,我从中获取文件位置。我也使用URLConnection实例中的getContentLength。两者都会返回与下载文件大小相同的文件大小 – Stimsoni 2012-01-29 23:50:41

+0

找到解决方案。这是因为read()每次只读取一个字节,但返回的读取字节数多于一个。我稍后会发布完整的解决方案,因为我没有权限快速回答我自己的问题。 – Stimsoni 2012-01-30 01:15:20

回答

0

解决了这个问题。

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

改用read(buffer,offset,length);

我还更改了我的代码,将数据写出到文件中,而不是将数据存储在内存中,并在所有数据都删除后输出。

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()变化

count += current; 

count++; 

这虽则下载作为while循环的循环数量相当低效的方式要大得多。在进行一些简短的性能测试后,下载速度似乎也会变慢(因为它需要为每个字节写入文件而不是一大块字节)。