studio manejo guardar archivos android bitmap bytearray ksoap2

android - manejo - Memoria insuficiente en una asignación de bytes(mapa de bits como cadena al servicio web usando jabón)



guardar bitmap android (3)

Tengo un bitmap , así que quiero subir una cadena webserivceas y quiero recuperar la cadena.

Para convertir bitmap a string am usando:

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

esto anterior String está usando como propiedad a en soapobject para cargar.

Pero me estoy quedando sin Out of memory on a 11674900-byte allocation , mientras Out of memory on a 11674900-byte allocation .

Y si depuré el problema, sin imprimir recibo

com.sun.jdi.InvocationException occurred invoking method.

en soaprequest.

¿Cómo resolver este problema y upload image al servicio web como una cadena?


Está creando 3 copias de una imagen de 11MB ( bitmap , stream , strBase64 ). Así que reduce el uso de memoria llamando

bitmap.recycle();

debajo de esta línea:

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

También cierre la secuencia cuando haya terminado con ella (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.


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

Intenta usar el tamaño de la muestra con

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

y las opciones de configuración para usar el tamaño de la muestra para devolver una imagen de un tamaño razonable.


Una solución simple para algunos podría ser agregar android: configChanges = "orientation | screenSize" a 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 de 13!