Не удается остановить / контролировать буферизацию на HttpURLConnection - PullRequest
0 голосов
/ 11 апреля 2020

Я загружаю файл на сервер. Загрузка работает нормально. Но я не могу заставить мои индикаторы выполнения работать, потому что это буферизация, независимо от того, использую ли я setFixedLengthStreamingMode или setChunkedStreamingMode. Это на Android 8.1.

Код для загрузки:

URL url = new URL(address);
conn = (HttpURLConnection) url.openConnection();
//conn.setFixedLengthStreamingMode(bytes.length);
conn.setChunkedStreamingMode(0);
conn.setRequestMethod("POST"); //NON-NLS
conn.setUseCaches(false);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setConnectTimeout(3000);
conn.setRequestProperty("Content-Type", "application/octet-stream"); //NON-NLS
//conn.setRequestProperty("Content-Length", String.valueOf(bytes.length)); //NON-NLS
conn.setRequestProperty("Authorization", String.format("Bearer %s", token)); //NON-NLS
conn.connect();

os = new BufferedOutputStream(conn.getOutputStream());
int remaining = bytes.length;
int start = 0;
while (remaining > 0) {
    D.log(BUG_PROGRESS, "Checking for buffering... Bytes uploaded: %d", start); //NON-NLS

    if (cancel.get()) {
        os.close();
        conn.disconnect();
        return null;
    }

    os.write(bytes, start, (Math.min(remaining, BYTES_PER_LOOP_SINGLE_UPLOAD)));
    os.flush();

    start += BYTES_PER_LOOP_SINGLE_UPLOAD;
    remaining -= BYTES_PER_LOOP_SINGLE_UPLOAD;
}
os.close();
D.log(BUG_PROGRESS, "Stream closed"); //NON-NLS

int responseCode = conn.getResponseCode();
D.log(BUG_PROGRESS, "Response Code Retrieved"); //NON-NLS

Я удалил код для индикатора выполнения, так как я просто использую журнал отладки в момент Все, что «Поток закрыт» происходит немедленно, затем getResponseCode занимает много времени - поэтому по какой-то причине он буферизируется.

Я попытался настроить несколько вещей:

  • Переключение между setFixedLengthStreamingMode() и setChunkedStreamingMode()
  • Изменение значения, переданного на setChunkedStreamingMode()
  • Перемещение в зависимости от того, какой метод я использовал позже (ближе к connect())
  • Добавление или удаление явная настройка заголовка Content-Length
  • Переключение между использованием BufferedOutputStream и обычным OutputStream

Теперь у меня совершенно нет идей, и я понятия не имею, откуда go Вот. Вся документация, которую я могу найти, говорит, что это должно работать.

ОБНОВЛЕНИЕ: кажется, что это не полностью буферизация - использование любого из методов имеет значение для больших файлов. Но он все еще выполняет некоторую буферизацию, и, похоже, нет способа контролировать, насколько он буферизуется. Даже если я установил setChunkedStreamingMode на что-то довольно низкое, он все еще буферизуется где-то между 500 КБ и 1 МБ (это кажется случайным). Даже при нормальном соединении загрузка по-прежнему занимает несколько секунд и может длиться дольше между «паузами», поэтому индикатор выполнения обновляется в лучшем случае каждые несколько секунд.

Есть ли способ уменьшить буферизацию подробнее?

Возможно, сервер, на который я отправляю, имеет некоторый контроль?

...