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