2011-11-10 10 views
11

Tengo un bitmap, así que quiero cargar una cadena webserivceas y quiero recuperar la cadena.Memoria insuficiente en una asignación de bytes (Mapa de bits como cadena al servicio web usando jabón)

Para la conversión de mapa de bits en la cadena estoy usando:

ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); 
byte[] byteArray = stream.toByteArray(); 

strBase64 = Base64.encodeToString(byteArray, Base64.URL_SAFE); 

esto por encima de String está utilizando como una propiedad que en soapobject a cargar.

Pero estoy obteniendo Out of memory on a 11674900-byte allocation, mientras imprimo y cargo.

y si lo depurado el tema, sin imprimir estoy recibiendo

com.sun.jdi.InvocationException occurred invoking method. 

en soaprequest.

Cómo resolver este problema y para upload image a WEBSERVICE como cadena?

Respuesta

9

Está creando 3 copias de una imagen de 11MB (bitmap, stream, strBase64). Por lo tanto reducir el uso de memoria llamando

bitmap.recycle(); 

debajo de esta línea:

bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); 

cerrar también la corriente cuando haya terminado con él (por debajo de stream.toByteArray();):

stream.close(); 
stream = null; 

Recuerde que no hay garantía de que la memoria se limpiará inmediatamente después de estas llamadas. La forma correcta de manejar este tipo de situaciones es transferir grandes archivos en partes.

+0

resolvió por matriz de octetos y ha utilizado la serialización antes de la solicitud de jabón. – Udaykiran

+0

@ Udayakiran, estoy teniendo el mismo error, lo que mencionaste en cuestión. Por favor, cuéntame la forma en que resolvió el problema. –

0

Una asignación de 11 millones de bytes mucho más grande que la que puede manejar la mayoría del montón de teléfonos. definitivamente no desea tener una matriz de bytes de ese tamaño en la memoria.

Trate de usar el tamaño insample con

BitmapFactory.decodeStream (InputStream es, Rect outPadding, BitmapFactory.Options opta)

y las opciones de configuración para utilizar el tamaño insample para devolver una imagen de tamaño razonable.

+0

¿Está diciendo que almacenar 11mb de datos en memoria no es posible en teléfonos Android? –

+0

Es posible, pero su teléfono no tiene tanta memoria libre o no puede desasignar la memoria tan rápido como la está asignando. –

-1

Una solución simple para algunos podría ser agregar android: configChanges = "orientation | screenSize" en su manifiesto. En mi caso, el emulador Nexus_S se colgaba sin esta línea, mientras que el dispositivo Nexus 7 en el que estaba probando no se bloqueaba durante la rotación.

Agregar esto parece ser una solución fácil para las aplicaciones que tienen un par de grandes mapas de bits "match_parent" para rotar y cambiar el tamaño.

¡Tenga cuidado si está creando API antes del 13!

Cuestiones relacionadas