Я загружаю файл на сервер. Загрузка работает нормально. Но я не могу заставить мои индикаторы выполнения работать, потому что это буферизация, независимо от того, использую ли я 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 МБ (это кажется случайным). Даже при нормальном соединении загрузка по-прежнему занимает несколько секунд и может длиться дольше между «паузами», поэтому индикатор выполнения обновляется в лучшем случае каждые несколько секунд.
Есть ли способ уменьшить буферизацию подробнее?
Возможно, сервер, на который я отправляю, имеет некоторый контроль?