Вопрос по android – URLConnection.getContentLength () возвращает -1

6

У меня есть URL, который, когда я вхожу в браузер, открывает изображение идеально. Но когда я пробую следующий код, я получаю getContentLength () как -1:

<code>URL url = new URL(imageUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();

// determine the image size and allocate a buffer
int fileSize = connection.getContentLength();
</code>

Пожалуйста, направьте меня, что может быть причиной этого?

У вас не всегда будет ContentLength, например, в случае потокового сервиса; Кроме того, сервер может не отправить его. Вы не можете зависеть от имеющейся длины контента. dmon
Это плохая идея. Память в Android довольно ограничена, и вам не нужно выделять огромные байтовые массивы. Вместо этого вы должны транслировать ответ на диск и читать изображение оттуда (и изменять размеры по мере необходимости). dmon
@dmon Мне нужен байт [] этих данных (изображения). Если у меня нет размера, пожалуйста, подскажите, как мне получить байт [] из этого? Khawar

Ваш Ответ

1   ответ
8

Кодирование передачи по частям, вы не сможете предварительно рассчитать размер. Ответ передается в потоковом режиме, и вам просто нужно выделить буфер для хранения изображения до завершения потока. Учтите, что делать это следует только в том случае, если вы можете гарантировать, что изображение достаточно маленькое, чтобы поместиться в память. Потоковая реакция на флэш-память является довольно разумным вариантом, если изображение может быть большим.

Решение в памяти:

private static final int READ_SIZE = 16384;

byte[] imageBuf;
if (-1 == contentLength) {
    byte[] buf = new byte[READ_SIZE];
    int bufferLeft = buf.length;
    int offset = 0;
    int result = 0;
    outer: do {
        while (bufferLeft > 0) {
            result = is.read(buf, offset, bufferLeft);
            if (result < 0) {
                // we're done
                break outer;
            }
            offset += result;
            bufferLeft -= result;
         }
         // resize
         bufferLeft = READ_SIZE;
         int newSize = buf.length + READ_SIZE;
         byte[] newBuf = new byte[newSize];
         System.arraycopy(buf, 0, newBuf, 0, buf.length);
         buf = newBuf;
     } while (true);
     imageBuf = new byte[offset];
     System.arraycopy(buf, 0, imageBuf, 0, offset);
 } else { // download using the simple method

Теоретически, если Http-клиент представляет себя как HTTP 1.0, большинство серверов переключатся обратно в не потоковый режим, но я не верю, что это возможно для URLConnection.

Error: User Rate Limit Exceeded Khawar

Похожие вопросы