Загрузка файла на Android больше, чем размер файла - PullRequest
0 голосов
/ 30 января 2012

Я загружаю видео, используя приведенный ниже код и сохраняю индикатор выполнения, чтобы показать, какая часть загрузки была завершена.

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 голосов
/ 31 января 2012

Разобрался в выпуске.

При загрузке и отслеживании количества загруженных данных не используйте read () из BufferedInputStream.

Вместо этого используйте чтение (буфер, смещение, длина);

Я также изменил свой код, чтобы записывать данные в файл по ходу, вместо того, чтобы хранить данные в памяти и выводить их после того, как все данные будут получены.

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 намного больше. После некоторого краткого тестирования производительности загрузка также кажется более медленной (так как необходимо записать в файл каждый байт вместо части байтов).

...