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();
Другие вопросы по тегам