2012-05-03 9 views
6

Tengo una URL que, cuando ingreso en el navegador, abre la imagen perfectamente. Pero cuando intento el siguiente código, consigo getContentLength() -1:URLConnection.getContentLength() devuelve -1

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

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

favor me guía lo que puede ser la razón detrás de esto?

+3

No siempre tendrá ContentLength, por ejemplo en el caso de un servicio de transmisión; también, el servidor podría no enviarlo. No puede depender de la longitud del contenido presente. – dmon

+0

@dmon Necesito byte [] de esos datos (imagen). Si no tengo el tamaño, entonces por favor, ¿cómo puedo obtener un byte []? – Khawar

+2

Esa es una mala idea. La memoria en Android es bastante limitada, y no debería asignar grandes matrices de bytes. En su lugar, debe transmitir la respuesta al disco y leer la imagen desde allí (y cambiar el tamaño según sea necesario). – dmon

Respuesta

8

Si el servidor envía la respuesta utilizando Chunked Transfer Encoding, no podrá precalcular el tamaño. La respuesta se transmite por secuencias y tendrá que asignar un búfer para almacenar la imagen hasta que se complete la transmisión. Tenga en cuenta que solo debe hacer esto si puede garantizar que la imagen sea lo suficientemente pequeña como para caber en la memoria. Transmitir la respuesta al almacenamiento flash es una opción bastante razonable si la imagen puede ser grande.

Dentro de la memoria de solución:

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 

En teoría, si el cliente HTTP se presenta como HTTP 1.0, la mayoría de los servidores cambia de nuevo al modo de no transmisión, pero yo no creo que esto es una posibilidad para URLConnection.

+0

Gracias por su respuesta. Pero necesito byte [] de esa información (imagen). Si no tengo el tamaño, entonces por favor, ¿cómo puedo obtener un byte []? – Khawar

Cuestiones relacionadas