On Tuesday, October 30, 2012 4:50:37 PM UTC+1, neon2004 wrote:
> 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