Hola.
Tengo una imagen que creo a partir de una url almacenada en una bd. Con
este bitmap que creo lo paso a base64 para guardar el string en las
preferencias y poder recoger esta preferencia en otra activity donde quiero
mostrar la imagen. El problema es que me peta ya que me da problemas de
memoria.
¿Cómo puedo solucionarlo?
El código que uso es el siguiente:
Activity Principal: (Convierto el bitmap y lo guardo en las preferencias)
URL url = new URL(urlAvatarl);
bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, 20, baos);
byte[] b = baos.toByteArray();
encodedImage = Base64.encodeToString(b, Base64.DEFAULT);
SharedPreferences prefs =
getSharedPreferences("MisPreferencias",Context.MODE_PRIVATE);
editor.putString(TAG_URLAVATAR, encodedImage);
editor.commit();
**** HASTA AQUI TODO CORRECTO *****
Activity Secundaria: (Recoge de las preferencias el bitmap almacenado como
base64, lo paso a bitmap y lo muestro)
SharedPreferences prefs =
getSharedPreferences("MisPreferencias",Context.MODE_PRIVATE);
urlAvatar = prefs.getString(TAG_URLAVATAR, "");
if( !urlAvatar.equalsIgnoreCase("") ){
byte[] b = Base64.decode(urlAvatar, Base64.DEFAULT);
bmp = BitmapFactory.decodeByteArray(b, 0, b.length);
////////////***************************************************************
EN ESTE PUNTO ES DONDE PETA **************////
btnPerfil.setImageBitmap(bmp);
}
La traza que me da es esta:
10-30 16:22:14.859: E/dalvikvm-heap(21347): Out of memory on a
31961104-byte allocation.
10-30 16:22:14.859: I/dalvikvm(21347): "AsyncTask #2" prio=5 tid=14 RUNNABLE
10-30 16:22:14.859: I/dalvikvm(21347): | group="main" sCount=0 dsCount=0
obj=0x4310b650 self=0x5d2125d8
10-30 16:22:14.859: I/dalvikvm(21347): | sysTid=22837 nice=10 sched=0/0
cgrp=apps/bg_non_interactive handle=1563176096
10-30 16:22:14.859: I/dalvikvm(21347): | schedstat=( 133824784 45184177
199 ) utm=9 stm=3 core=0
10-30 16:22:14.859: I/dalvikvm(21347): at
android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
10-30 16:22:14.864: I/dalvikvm(21347): at
android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:650)
10-30 16:22:14.864: I/dalvikvm(21347): at
android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:722)
10-30 16:22:14.869: I/dalvikvm(21347): at
com.famovie.Login$ComprobarInternet$Logearse.doInBackground(Login.java:287)
10-30 16:22:14.869: I/dalvikvm(21347): at
com.famovie.Login$ComprobarInternet$Logearse.doInBackground(Login.java:1)
10-30 16:22:14.879: I/dalvikvm(21347): at
android.os.AsyncTask$2.call(AsyncTask.java:287)
10-30 16:22:14.969: I/dalvikvm(21347): at
java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
10-30 16:22:14.969: I/dalvikvm(21347): at
java.util.concurrent.FutureTask.run(FutureTask.java:137)
10-30 16:22:14.969: I/dalvikvm(21347): at
android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
10-30 16:22:14.974: I/dalvikvm(21347): at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1 076)
10-30 16:22:14.974: I/dalvikvm(21347): at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java: 569)
10-30 16:22:14.974: I/dalvikvm(21347): at
java.lang.Thread.run(Thread.java:856)
10-30 16:22:14.974: D/AbsListView(21347):
[unregisterDoubleTapMotionListener]
10-30 16:22:14.974: D/skia(21347): --- decoder->decode returned false
10-30 16:22:14.979: I/MotionRecognitionManager(21347):
.unregisterListener : / listener count = 0->0,
listener=android.widget.AbsListView$4@42c92868
10-30 16:22:14.989: W/dalvikvm(21347): threadid=14: thread exiting with
uncaught exception (group=0x41fc92a0)
10-30 16:22:14.999: E/AndroidRuntime(21347): FATAL EXCEPTION: AsyncTask #2
10-30 16:22:14.999: E/AndroidRuntime(21347): java.lang.RuntimeException: An
error occured while executing doInBackground()
10-30 16:22:14.999: E/AndroidRuntime(21347): at
android.os.AsyncTask$3.done(AsyncTask.java:299)
10-30 16:22:14.999: E/AndroidRuntime(21347): at
java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
10-30 16:22:14.999: E/AndroidRuntime(21347): at
java.util.concurrent.FutureTask.setException(FutureTask.java:124)
10-30 16:22:14.999: E/AndroidRuntime(21347): at
java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
10-30 16:22:14.999: E/AndroidRuntime(21347): at
java.util.concurrent.FutureTask.run(FutureTask.java:137)
10-30 16:22:14.999: E/AndroidRuntime(21347): at
android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
10-30 16:22:14.999: E/AndroidRuntime(21347): at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1 076)
10-30 16:22:14.999: E/AndroidRuntime(21347): at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java: 569)
10-30 16:22:14.999: E/AndroidRuntime(21347): at
java.lang.Thread.run(Thread.java:856)
10-30 16:22:14.999: E/AndroidRuntime(21347): Caused by:
java.lang.OutOfMemoryError
10-30 16:22:14.999: E/AndroidRuntime(21347): at
android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
10-30 16:22:14.999: E/AndroidRuntime(21347): at
android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:650)
10-30 16:22:14.999: E/AndroidRuntime(21347): at
android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:722)
10-30 16:22:14.999: E/AndroidRuntime(21347): at
com.famovie.Login$ComprobarInternet$Logearse.doInBackground(Login.java:287)
10-30 16:22:14.999: E/AndroidRuntime(21347): at
com.famovie.Login$ComprobarInternet$Logearse.doInBackground(Login.java:1)
10-30 16:22:14.999: E/AndroidRuntime(21347): at
android.os.AsyncTask$2.call(AsyncTask.java:287)
10-30 16:22:14.999: E/AndroidRuntime(21347): at
java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
10-30 16:22:14.999: E/AndroidRuntime(21347): ... 5 more
10-30 16:22:25.724: E/WindowManager(21347): Activity com.famovie.Login has
leaked window
com.android.internal.policy.impl.PhoneWindow$DecorView@42faaab0 that was
originally added here
10-30 16:22:25.724: E/WindowManager(21347): android.view.WindowLeaked:
Activity com.famovie.Login has leaked window
com.android.internal.policy.impl.PhoneWindow$DecorView@42faaab0 that was
originally added here
10-30 16:22:25.724: E/WindowManager(21347): at
android.view.ViewRootImpl.<init>(ViewRootImpl.java:402)
10-30 16:22:25.724: E/WindowManager(21347): at
android.view.WindowManagerImpl.addView(WindowManagerImpl.java:311)
10-30 16:22:25.724: E/WindowManager(21347): at
android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224)
10-30 16:22:25.724: E/WindowManager(21347): at
android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl. java:149)
10-30 16:22:25.724: E/WindowManager(21347): at
android.view.Window$LocalWindowManager.addView(Window.java:558)
10-30 16:22:25.724: E/WindowManager(21347): at
android.app.Dialog.show(Dialog.java:277)
10-30 16:22:25.724: E/WindowManager(21347): at
com.famovie.Login$ComprobarInternet$Logearse.onPreExecute(Login.java:255)
10-30 16:22:25.724: E/WindowManager(21347): at
android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)
10-30 16:22:25.724: E/WindowManager(21347): at
android.os.AsyncTask.execute(AsyncTask.java:534)
10-30 16:22:25.724: E/WindowManager(21347): at
com.famovie.Login$ComprobarInternet.onPostExecute(Login.java:229)
10-30 16:22:25.724: E/WindowManager(21347): at
com.famovie.Login$ComprobarInternet.onPostExecute(Login.java:1)
10-30 16:22:25.724: E/WindowManager(21347): at
android.os.AsyncTask.finish(AsyncTask.java:631)
10-30 16:22:25.724: E/WindowManager(21347): at
android.os.AsyncTask.access$600(AsyncTask.java:177)
10-30 16:22:25.724: E/WindowManager(21347): at
android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
10-30 16:22:25.724: E/WindowManager(21347): at
android.os.Handler.dispatchMessage(Handler.java:99)
10-30 16:22:25.724: E/WindowManager(21347): at
android.os.Looper.loop(Looper.java:137)
10-30 16:22:25.724: E/WindowManager(21347): at
android.app.ActivityThread.main(ActivityThread.java:4898)
10-30 16:22:25.724: E/WindowManager(21347): at
java.lang.reflect.Method.invokeNative(Native Method)
10-30 16:22:25.724: E/WindowManager(21347): at
java.lang.reflect.Method.invoke(Method.java:511)
10-30 16:22:25.724: E/WindowManager(21347): at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java: 1006)
10-30 16:22:25.724: E/WindowManager(21347): at
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
10-30 16:22:25.724: E/WindowManager(21347): at
dalvik.system.NativeStart.main(Native Method)
Esta imagen es subida por un usuario al hacer el registro.
La primera ve que se logea me peta tal como indico, pero el proceso de
logueado se ha realizado, aunque no ha mostrado la siguiente activity, y lo
almaceno para que la siguiente vez que entre, si se ha logeado
anteriormente no tenga que volver hacerlo. Pues esta segunda vez que ya
esta almacenada el bitmap en las preferencias y no conecta con el
webservice para recoger los datos, si que me carga bien la activity con la
imagen.
Este mismo problema de memoria me ocurre a veces cuando el usuario hace el
registro.
En este momento le doy la opción de elegir una foto de la galería y hay
veces que me peta mostrando este error de OutOfMemoryError. El caso es que
me pasa con imagenes que unas veces selecciona y peta y otras las
seleccionas y muestro en un ImageButton sin problema alguno.
Por último tengo una duda con respecto a las imágenes y es que algunas de
ellas, hasta ahora solo me ocurre con una ya que tampoco he probado con
muchas imágenes diferentes,
resulta que me sale girada y no entiendo porque.
Espero que podáis ayudarme.
Gracias