Problemas de memoria con imagenes

757 views
Skip to first unread message

neon2004

unread,
Oct 30, 2012, 11:50:36 AM10/30/12
to desarrollad...@googlegroups.com
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:1076)
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:1076)
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



juande

unread,
Oct 31, 2012, 12:25:52 PM10/31/12
to desarrollad...@googlegroups.com
Es que lo que estás haciendo es una barbaridad!!!!!!  !! ! !! !!! ! !  !! ! !! O_O!

El mensaje de error te dice que NO hay memoria para cargar en el "heap" algo que ocupa casi 32 Megabytes. Algo normal, ya que la mayoría de teléfonos Android tienen un "heap" de 16 Megabytes, así que tu aplicación fallará en todos estos teléfono. Toda esta información sobre Bitmaps y los problemas de memoria la puedes encontrar aquí:

¿No has pensado en guardar la foto "tal cual" en la tarjeta SD, o en una base de datos SQLite?

juande

unread,
Oct 31, 2012, 12:30:45 PM10/31/12
to desarrollad...@googlegroups.com
También puede hacer lo que estás haciendo... (aunque sea una barbaridad guardar la imagen en Base64 en un SharedPreferences...) si a la hora de que un usuario se registre, guardas la foto reduciéndole el tamaño a uno considerablemente más pequeño.

neon2004

unread,
Nov 5, 2012, 4:42:47 AM11/5/12
to desarrollad...@googlegroups.com
Hola.

La imagen que subo pesa 514kb y otra 1500 kb, son imágenes sacadas con la cámara del móvil. Aunque podría darse el caso de que alguien subiera una bastante pesada y seria conveniente ver como poder quitarle calidad.

El tema de guardarlo en SD p en una bd sqlite no me sirve puesto que esta imagen será el avatar del usuario y si este usuario se registra en otro movil ya no tendria el avatar. Por eso lo subo a un servidor.

Lo que hago es seleccionar una imagen de la galería o tomar una foto y mostrarla en un ImageButton. Al registrarse subo mediante ftp la imagen a un servidor.
En el momento de logearse obtengo esa ruta y a partir de ella creo un bitMap el que comprimo y paso a Base 64 para guardarlo en SharedPreferences.

Una vez logeado recupero esa SharedPreferences y muestro el bitMap en un ImageButton.

El codigo de lo descrito anteriormente es el siguiente:

ACTIVITY REGISTRO

Selecciono o tomo una foto:


private void dialogPhoto() {
        try {
            final CharSequence[] items = { "Seleccionar de la galería",
                    "Hacer una foto" };

            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("Seleccionar una foto");
            builder.setItems(items, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int item) {
                    switch (item) {
                    case 0:
                        Intent intent = new Intent(
                                Intent.ACTION_PICK,
                                android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI);
                        intent.setType("image/*");
                        startActivityForResult(intent, SELECT_IMAGE);
                        break;
                    case 1:
                        startActivityForResult(
                                new Intent(
                                        android.provider.MediaStore.ACTION_IMAGE_CAPTURE),
                                TAKE_PICTURE);
                        break;
                    }

                }
            });
            AlertDialog alert = builder.create();
            alert.show();
        } catch (Exception e) {
        }

    }

   @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Uri selectedImage = null;
        try {
            if (requestCode == SELECT_IMAGE)
                if (resultCode == Activity.RESULT_OK) {
                     selectedImage = data.getData();
                     
                     ruta = getPath(selectedImage);
                    int tamRuta = ruta.length();
                    int posBarra = ruta.lastIndexOf("/");
                     name = ruta.substring(posBarra+1);
                     setPic(btnAvatar,ruta);
         f = new File(ruta,name);

                }
            if (requestCode == TAKE_PICTURE)
                if (resultCode == Activity.RESULT_OK) {
                     selectedImage = data.getData();                   
                }
        } catch (Exception e) {

        }       
       
    }
   
    private String getPath(Uri uri) {
         String[] projection = { android.provider.MediaStore.Images.Media.DATA };
         Cursor cursor = managedQuery(uri, projection, null, null, null);
         int column_index = cursor.getColumnIndexOrThrow(android.provider.MediaStore.Images.Media.DATA);
         cursor.moveToFirst();
         return cursor.getString(column_index);
           }

Muestro la imagen seleccionada en el ImageButton:

private void setPic(ImageButton mImageView, String imageURI) {
            // Get the original bitmap dimensions
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(imageURI, options);

            // Calculate inSampleSize
            options.inSampleSize = calculateInSampleSize(options, REQ_HEIGHT, REQ_WIDTH);

            // Decode bitmap with inSampleSize set
            options.inJustDecodeBounds = false;
            Bitmap bitmap = BitmapFactory.decodeFile(imageURI, options);

            //need rotation?
            float rotation = rotationForImage(this, Uri.fromFile(new File(imageURI)));

            if (rotation != 0) {
                //rotate
                Matrix matrix = new Matrix();
                matrix.preRotate(rotation);
                mImageView.setImageBitmap(Bitmap.createBitmap(bitmap, 180,100, REQ_HEIGHT, REQ_WIDTH, matrix, true)); // REQ_HEIGHT = 450, REQ_WIDTH = 450
            
            } else {
                //use the original
                mImageView.setImageBitmap(BitmapFactory.decodeFile(imageURI, options));

            }
           
            SharedPreferences prefs = getSharedPreferences("MisPreferencias",
                    Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = prefs.edit();
            editor.putFloat(TAG_URIAVATAR, rotation);
            editor.commit();
        }

        public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
            // Raw height and width of image
            final int height = options.outHeight;
            final int width = options.outWidth;
            int inSampleSize = 1;

            if (height > reqHeight || width > reqWidth) {
                if (width > height) {
                    inSampleSize = Math.round((float) height / (float) reqHeight);
                } else {
                    inSampleSize = Math.round((float) width / (float) reqWidth);
                }
            }
            return inSampleSize;
        }

        public static float rotationForImage(Context context, Uri uri) {
            try {
                if (uri.getScheme().equals("content")) {
                    String[] projection = { Images.ImageColumns.ORIENTATION };
                    Cursor c = context.getContentResolver().query(uri, projection, null, null, null);
                    if (c.moveToFirst()) {
                        return c.getInt(0);
                    }
                } else if (uri.getScheme().equals("file")) {
                    ExifInterface exif = new ExifInterface(uri.getPath());
                    int rotation = (int) exifOrientationToDegrees(exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL));
                    return rotation;
                }
                return 0;

            } catch (IOException e) {
                Log.e("ERROR", "Error checking exif", e);
                return 0;
            }
        }

        private static float exifOrientationToDegrees(int exifOrientation) {
            if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) {
                return 90;
            } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180) {
                return 180;
            } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) {
                return 270;
            }
            return 0;
        }


Subo mediante ftp la imagen al servidor:

 try{
                      FTPClient ftpClient = new FTPClient(); 
                      ftpClient.connect(InetAddress.getByName(servidor));
                      ftpClient.login(TAG_USERFTP, TAG_PASSFTP);
                     
                      ftpClient.changeWorkingDirectory(TAG_URLIMAGEN);
                      ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
                      BufferedInputStream buffIn=null;
                      buffIn=new BufferedInputStream(new FileInputStream(ruta));
                      ftpClient.enterLocalPassiveMode();
                      ftpClient.storeFile(name, buffIn);
                      buffIn.close();
                      ftpClient.logout();
                      ftpClient.disconnect(); 
                     
                      avatarSubido = "Ok";
                      urlAvatar = name;
                   
                }catch (Exception e) {               
                    Log.d("ERROR FTP: ", e.getMessage().toString());
                }

ACTIVITY LOGEO

Creo un bitMap a partir de la ruta obtenida, lo comprimo, convierto a Base64 y guardo en SharedPreferences


URL url = new URL(urlAvatarl);
                     bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());

 ByteArrayOutputStream baos = new ByteArrayOutputStream();
         bmp.compress(Bitmap.CompressFormat.JPEG, 20, baos);   // AQUI COMPRIMO LA IMAGEN SI NO ME EQUIVOCO

         byte[] b = baos.toByteArray();
         
         encodedImage = Base64.encodeToString(b, Base64.DEFAULT);
        // TODO Auto-generated method stub

        SharedPreferences prefs = getSharedPreferences("MisPreferencias",
                Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = prefs.edit();

editor.putString(TAG_URLAVATAR, encodedImage);
        editor.commit();

ACTIVITY TRAS LOGEARSE

Recupero SharedPreferences y que viene en Base64, creo el bitMap y lo muestro en un ImageButton


  urlAvatar = prefs.getString(TAG_URLAVATAR, "");
        rotation = prefs.getFloat(TAG_URIAVATAR, 0);
        setPic(btnPerfil,urlAvatar);

private void setPic(ImageButton mImageView, String imageURI) {
        // Get the original bitmap dimensions
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;

       
        byte[] b = Base64.decode(urlAvatar, Base64.DEFAULT);
        BitmapFactory.decodeByteArray(b, 0, b.length, options);
 


        // Calculate inSampleSize
        options.inSampleSize = calculateInSampleSize(options, REQ_HEIGHT, REQ_WIDTH);

        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;
        bmp = BitmapFactory.decodeByteArray(b, 0, b.length, options);

        //need rotation?
//        float rotation = rotationForImage(getApplicationContext(), Uri.fromFile(new File(uriAvatar)));
       
        if (rotation != 0) {
            //rotate
            Matrix matrix = new Matrix();
            matrix.preRotate(rotation);
            mImageView.setImageBitmap(Bitmap.createBitmap(bmp, 180, 100, REQ_HEIGHT, REQ_WIDTH, matrix, true));
        } else {
            //use the original
            mImageView.setImageBitmap(BitmapFactory.decodeByteArray(b, 0, b.length, options));
        }
    }

    public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
        // Raw height and width of image
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;

        if (height > reqHeight || width > reqWidth) {
            if (width > height) {
                inSampleSize = Math.round((float) height / (float) reqHeight);
            } else {
                inSampleSize = Math.round((float) width / (float) reqWidth);
            }
        }
        return inSampleSize;
    }

    public static float rotationForImage(Context context, Uri uri) {
        try {
            if (uri.getScheme().equals("content")) {
                String[] projection = { Images.ImageColumns.ORIENTATION };
                Cursor c = context.getContentResolver().query(uri, projection, null, null, null);
                if (c.moveToFirst()) {
                    return c.getInt(0);
                }
            } else if (uri.getScheme().equals("file")) {
                ExifInterface exif = new ExifInterface(uri.getPath());
                int rotation = (int) exifOrientationToDegrees(exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL));
                return rotation;
            }
            return 0;

        } catch (IOException e) {
            Log.e("ERROR", "Error checking exif", e);
            return 0;
        }
    }

    private static float exifOrientationToDegrees(int exifOrientation) {
        if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) {
            return 90;
        } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180) {
            return 180;
        } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) {
            return 270;
        }
        return 0;
    }

mucho de este código a sido obtenido de otras fuentes para remediar problemas que me fueron surgiendo. Puede que hayas numerosas chapuzas o barbaridades que puedan ser mejoradas, pero por mi inexperiencia y mi poco conocimiento no se si es así por lo que estoy abierto a cualquier cambio que pueda arreglar o mejorar cosas y de este modo también me serviría para aprender. Gracias

Jc Miñarro

unread,
Nov 5, 2012, 4:46:43 AM11/5/12
to desarrollad...@googlegroups.com
Pero por qué te empeñas en guardar la imagen en el sharedPreferences??
Guardala en la SD, comprimida o como quieras, pero no en el sharedPreferences.


--
Para participar es necesario que leas detenidamente las normas del grupo: http://goo.gl/AmNsS
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a desarrolladores-a...@googlegroups.com
Para ver este debate en la Web, visita https://groups.google.com/d/msg/desarrolladores-android/-/VMH17A0_xf4J.
 
 



--
Un saludo,
Jc Miñarro

-------------------------------------------------------------------------------------------
CarteleraApp - Consulta la cartelera y estrenos de los cines españoles.

Juan de Dios Maldonado Sánchez

unread,
Nov 5, 2012, 5:07:03 AM11/5/12
to desarrollad...@googlegroups.com
Dices: "La imagen que subo pesa 514kb y otra 1500 kb"
Te digo: No es lo que pesa, sino las dimensiones de la misma. (que es lo que cuenta a la hora de cargarla en memoria) Creo que te has leído poco el enlace que te pasé. :(

El problema es cuando cargas la imagen en memoria en un Bitmap. Por ejemplo, si las dimensiones de la misma son 2592x1936 (da igual cuando ocupe en el archivo en el que la tienes guardada, ya que dentro del archivo viene comprimida), tienes que 2592*1936*4 = 19MB de memoria que necesitas para cargarla en memoria. (Resumiendo: No hay forma de cargar esa imagen)

Lo que te digo es que no tiene sentido que tengas una imagen gigantesca si luego lo que haces es mostrarla en un espacio muy pequeño.

Si aún quieres seguir por tu camino, allá tú.


2012/11/5 Jc Miñarro <josecarlo...@gmail.com>

neon2004

unread,
Nov 5, 2012, 11:09:44 AM11/5/12
to desarrollad...@googlegroups.com
El enlace que me pusiste si lo he visto y uso lo mismo para crear la imagen, es decir creo una imagen con el tamaño indicado.

El problema es que no usaba ese código para crear el bitMap a partir de la ruta que tenia y claro ese si tenia las dimensiones reales no las que le indico de menor tamaño, por lo que podía cargarlo una vez al haber memoria pero la siguiente vez que pretendía crear otro bitMap pues es cuando se quedaba sin memoria.

De todas formas a parte de solucionar el problema me ha servido mucho la ayuda prestada ya que antes tenia un codigo que no entendia del todo y creo haberlo entendido ahora bastante mejor.


Gracias


2012/11/5 Jc Miñarro <josecarlo...@gmail.com>
Para anular tu suscripción a este grupo, envía un correo electrónico a desarrolladores-android+unsub...@googlegroups.com
Para ver este debate en la Web, visita https://groups.google.com/d/msg/desarrolladores-android/-/VMH17A0_xf4J.
 
 



--
Un saludo,
Jc Miñarro

-------------------------------------------------------------------------------------------
CarteleraApp - Consulta la cartelera y estrenos de los cines españoles.

--
Para participar es necesario que leas detenidamente las normas del grupo: http://goo.gl/AmNsS
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a desarrolladores-android+unsub...@googlegroups.com
 
 

Juan de Dios Maldonado Sánchez

unread,
Nov 5, 2012, 11:16:57 AM11/5/12
to desarrollad...@googlegroups.com
Eso me pasa por no leer bien.
Gracias por compartir tu código.


2012/11/5 neon2004 <diego....@bbvaglobalnet.com>
Para anular tu suscripción a este grupo, envía un correo electrónico a desarrolladores-a...@googlegroups.com
Para ver este debate en la Web, visita https://groups.google.com/d/msg/desarrolladores-android/-/d9awELX505gJ.
 
 

Reply all
Reply to author
Forward
0 new messages