Метод Android DataOutputStream Flush, похоже, не выполняет сброс - PullRequest
0 голосов
/ 17 марта 2011

Вот небольшой код, который я делаю. (Я удалил некоторые из них, чтобы сделать их более удобочитаемыми.) По сути, я открываю файл и обрабатываю по 3 тыс. Порций за раз. Они кодируются в Base64 (сейчас 4k чанка) и загружаются через сообщение HTTP. После каждого вызова DataOutputStream.writeBytes () я также вызываю DataOutputStream.flush (), а затем обновляю индикатор выполнения на основе того, сколько было отправлено.

File myImage = new File(somepath);
int bytesAvailable = myImage.length();
while (bytesAvailable > 0)
{
   byte[] buffer = new byte[Math.min(12288, (int)bytesAvailable)];
   bytesRead = fileInputStream.read(buffer, 0, Math.min(12288, (int)bytesAvailable));

   if (bytesRead > 0)
   {
      s2 = Base64.encodeBytes(buffer);
      bytesAvailable = fileInputStream.available();

      dataStream.writeBytes(s2);
      dataStream.flush();

      // UPDATE THE PROGRESS BAR HERE
   }
}

Теперь, когда я запускаю приложение, изображение успешно загружается каждый раз. Однако, если я наблюдаю за индикатором мобильного соединения (стрелки вверх / вниз), они не загораются, когда индикатор выполнения перемещается. В течение 10 секунд или около того полоса будет иметь значение от 0 до 100% для изображения размером 3 МБ (слишком быстро для моего телефона 3G). Затем при 100%, после выполнения этого цикла, вызывается метод dataStream.close (). Это когда начинается передача данных (как указано стрелками). Это сидит за несколько минут до финиша.

Не правильно ли я понимаю flush ()? Разве это не должно вызывать передачу данных?

1 Ответ

2 голосов
/ 06 июня 2011

Мне кажется, что вы добавляете блоки данных 4k в поток данных, а затем отправляете этот поток данных в виде http-сообщения на сервер.Если это так, то ваш цикл по существу перебирает копию памяти, и передача http произойдет после того, как вы закончите с потоком данных.Единственный способ узнать наверняка, как идет загрузка, - это получить в свои руки сокет и его поток данных.Это выглядит довольно сложно, если вы используете DefaultHttpClientConnection и т. Д.

...