Android не читает полный контент HttpURLConnection InputStream
У меня есть следующий код, который был протестирован в классе приложения Java, и он работает. Он вызывает мой бэкэнд-сервлет Java и считывает двоичные байты в byte[].
private byte[] readResponse(HttpURLConnection connection) throws IOException {
InputStream inputStream = connection.getInputStream();
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
int contentLength = connection.getContentLength();
byte[] buffer;
if (contentLength>-1) {
buffer = new byte[contentLength];
int readCount = bufferedInputStream.read(buffer, 0 , contentLength);
System.out.println("Content Length is " + contentLength + " Read Count is " + readCount);
}
return buffer;
}
Теперь я перемещаю этот код Java в код Android, и каким-то образом он только читает содержимое частично, сервер отправляет примерно 5709 байт, а приложение Android читает только 1448 байт.
Интересно, если я перейду в режим отладки и поставлю точку останова в строке
int readCount = bufferedInputStream.read(buffer, 0 , contentLength);
И делать пошаговую отладку, переменную
readCount
может достигать 5709 байт. Если я не ставлю точку останова, она становится 1448 байтов. Зачем?
Это похоже на проблему с задержкой?
Благодарю. С Уважением,
2 ответа
Спасибо всем за помощь, особенно за ответ пользователя greenapps. Я разбил процесс загрузки на 1 КБ буфера и решил проблему. Ниже приведен код:
private byte[] readResponse(HttpURLConnection connection) throws IOException {
InputStream inputStream = connection.getInputStream();
int contentLength = connection.getContentLength();
byte[] buffer;
buffer = new byte[contentLength];
int bufferSize = 1024;
int bytesRemaining = contentLength;
int loadedBytes;
for (int i = 0; i < contentLength; i = i + loadedBytes) {
int readCount = bytesRemaining > bufferSize ? bufferSize : bytesRemaining;
loadedBytes = inputStream.read(buffer, i , readCount);
bytesRemaining = bytesRemaining - loadedBytes;
}
return buffer;
}
Это работает для меня:
// Read response
//int responseCode = connection.getResponseCode();
StringBuilder response = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
reader.close();
response.toString();