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