Question

UPDATE : 10/12/2012

After making with images:

 WeakHashMap<Bitmap, WeakReference<Bitmap>> objReferenciaDebilBitmaps;
 Bitmap imagen = datossss.getImagen();
 objreCReferencias.RegristrarReferenciaDebilBitmap(imagen, objReferenciaDebilBitmaps);

my class Creferencias

public class CReferencias {


public CReferencias(){

}

public void RegristrarReferenciaDebilBitmap(Bitmap img, WeakHashMap<Bitmap, WeakReference<Bitmap>> objReferenciaDebilBitmaps){
    WeakReference<Bitmap> objrererencia1 = new WeakReference<Bitmap>(img);
    objReferenciaDebilBitmaps.put(img, objrererencia1);

}

After using this every time I do I create an Image, I do not know if it's the right way to use weak references to the bitmap,

but still gives me the problem sigiente

this is my logcat

  12-10 13:54:53.523: E/dalvikvm-heap(1211): Out of memory on a 2304016-byte allocation.
12-10 13:54:53.528: E/AndroidRuntime(1211): FATAL EXCEPTION: main
12-10 13:54:53.528: E/AndroidRuntime(1211): java.lang.OutOfMemoryError
12-10 13:54:53.528: E/AndroidRuntime(1211):     at android.graphics.Bitmap.nativeCreate(Native Method)
12-10 13:54:53.528: E/AndroidRuntime(1211):     at android.graphics.Bitmap.createBitmap(Bitmap.java:605)
12-10 13:54:53.528: E/AndroidRuntime(1211):     at android.graphics.Bitmap.createBitmap(Bitmap.java:551)
12-10 13:54:53.528: E/AndroidRuntime(1211):     at dep.Agenda.CustomAdapterDetalleEventos.getView(CustomAdapterDetalleEventos.java:558)
12-10 13:54:53.528: E/AndroidRuntime(1211):     at android.widget.HeaderViewListAdapter.getView(HeaderViewListAdapter.java:220)
12-10 13:54:53.528: E/AndroidRuntime(1211):     at android.widget.AbsListView.obtainView(AbsListView.java:2201)
12-10 13:54:53.528: E/AndroidRuntime(1211):     at android.widget.ListView.makeAndAddView(ListView.java:1774)
12-10 13:54:53.528: E/AndroidRuntime(1211):     at android.widget.ListView.fillUp(ListView.java:705)
12-10 13:54:53.528: E/AndroidRuntime(1211):     at android.widget.ListView.fillGap(ListView.java:645)
12-10 13:54:53.528: E/AndroidRuntime(1211):     at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5263)
12-10 13:54:53.528: E/AndroidRuntime(1211):     at android.widget.AbsListView$TwFlingRunnable.run(AbsListView.java:4156)
12-10 13:54:53.528: E/AndroidRuntime(1211):     at android.os.Handler.handleCallback(Handler.java:605)
12-10 13:54:53.528: E/AndroidRuntime(1211):     at android.os.Handler.dispatchMessage(Handler.java:92)
12-10 13:54:53.528: E/AndroidRuntime(1211):     at android.os.Looper.loop(Looper.java:137)
12-10 13:54:53.528: E/AndroidRuntime(1211):     at android.app.ActivityThread.main(ActivityThread.java:4507)
12-10 13:54:53.528: E/AndroidRuntime(1211):     at java.lang.reflect.Method.invokeNative(Native Method)
12-10 13:54:53.528: E/AndroidRuntime(1211):     at java.lang.reflect.Method.invoke(Method.java:511)
12-10 13:54:53.528: E/AndroidRuntime(1211):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
12-10 13:54:53.528: E/AndroidRuntime(1211):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
12-10 13:54:53.528: E/AndroidRuntime(1211):     at dalvik.system.NativeStart.main(Native Method)

this is lines my adapter

    public View getView(final int position,  View convertView, ViewGroup parent){
        View vistaFila =null;

     final  ElementosLinea objelementos;//=null;

        //final ElementosLinea obj;
        //final View auxVistaFila=null;


     LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        if (convertView == null) {
             //  LayoutInflater inflator = context.getLayoutInflater();


            //LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            vistaFila = vi.inflate(R.layout.ll_lineas_lista_detalle_evento_nueva, null);

            //AsignarElementos(vistaFila);

           objelementos = new ElementosLinea();
          AsignarElementos(vistaFila,objelementos);




         vistaFila.setTag(objelementos);
         objelementos.posicion= position;

        }else{
            //vistaFila = vi.inflate(R.layout.ll_lineas_lista_detalles_evento, null);
          vistaFila=convertView;
          objelementos=(ElementosLinea)convertView.getTag();
          objelementos.posicion= position;
       }

        DetalleEvento datossss = arrayDatos.get(position);

        if (datossss.getGusta()==0){

            objelementos.btnMegusta.setBackgroundResource(R.drawable.megustagris);
            objelementos.txtMegusta.setText("Me gusta");
        }else{
            objelementos.btnMegusta.setBackgroundResource(R.drawable.megustaazul);
            objelementos.txtMegusta.setText("No me gusta"); 
            }


      //llenamos la barra de progreso
    if (datossss.getTipo()==1){//SI ES UN VIDEO

        objelementos.txtTitulo.setText(datossss.getTituloPost());
        objelementos.txtAutor.setText(datossss.getAutor());
        objelementos.txtPost.setVisibility(View.INVISIBLE);

        if (datossss.getImagen()!=null){
            Bitmap imagen = datossss.getImagen();
            objreCReferencias.RegristrarReferenciaDebilBitmap(imagen, objReferenciaDebilBitmaps);
             int width = imagen.getWidth();
                int height = imagen.getHeight();
                int newWidth = activiadPricipal.getWindowManager().getDefaultDisplay().getWidth();
                int newHeight = newWidth-80;

                float scalarw=((float) newWidth) /width;
                float scalarh=((float) newHeight) /height;

            Matrix ma = new Matrix();
             ma.postScale(scalarw, scalarh);

             Bitmap res = Bitmap.createBitmap(imagen, 0, 0,
                  width, height, ma, true);
        objreCReferencias.RegristrarReferenciaDebilBitmap(res, objReferenciaDebilBitmaps); 
        objelementos.imgfotoVideo.setImageBitmap(res);
        //imagen.recycle();
        //res.recycle();
        objelementos.btnComentarios.setEnabled(true);
        objelementos.pgrprogreso.setVisibility(View.INVISIBLE);

        }else{


              int newWidth = activiadPricipal.getWindowManager().getDefaultDisplay().getWidth();
              int newHeight = newWidth-80;

              objelementos.imgfotoVideo.setImageBitmap(null);
              objelementos.imgfotoVideo.setMinimumHeight(newHeight);
              objelementos.imgfotoVideo.setMinimumWidth(newWidth);
              objelementos.pgrprogreso.setVisibility(View.VISIBLE);
        objelementos.btnComentarios.setEnabled(false);
        }
        objelementos.imgfotoVideo.setVisibility(View.VISIBLE);
        objelementos.btnVerVideo.setVisibility(View.VISIBLE);
        objelementos.txtFecha.setText(datossss.getFecha());
        objelementos.btnVerfoto.setVisibility(View.INVISIBLE);




    }else{  if (datossss.getTipo()==2){ //SI ES UN POST

        objelementos.txtTitulo.setText(datossss.getTituloPost());
        objelementos.txtAutor.setText(datossss.getAutor());
        objelementos.txtPost.setText(datossss.getTexto());
        objelementos.txtPost.setVisibility(View.VISIBLE);
        objelementos.imgfotoVideo.setVisibility(View.INVISIBLE);
        objelementos.imgfotoVideo.setImageBitmap(null);
        objelementos.btnVerVideo.setVisibility(View.INVISIBLE);
        objelementos.txtFecha.setText(datossss.getFecha());
        objelementos.btnVerfoto.setVisibility(View.INVISIBLE);
        objelementos.btnComentarios.setEnabled(true);

        objelementos.imgfotoVideo.setMinimumHeight(0);
          objelementos.imgfotoVideo.setMinimumWidth(0);

          objelementos.pgrprogreso.setVisibility(View.INVISIBLE);
        //rtlCuerpo.set






    }else{//SI ES UNA FOTO

        objelementos.txtTitulo.setText(datossss.getTituloPost());
        objelementos.txtAutor.setText(datossss.getAutor());
        objelementos.imgfotoVideo.setVisibility(View.VISIBLE);
        objelementos.btnVerfoto.setVisibility(View.VISIBLE);


        if (datossss.getImagen()!=null){
        Bitmap imagen = datossss.getImagen();
         objreCReferencias.RegristrarReferenciaDebilBitmap(imagen, objReferenciaDebilBitmaps); 
         int width = imagen.getWidth();
            int height = imagen.getHeight();
            int newWidth = activiadPricipal.getWindowManager().getDefaultDisplay().getWidth();
            int newHeight = newWidth-80;

            float scalarw=((float) newWidth) /width;
            float scalarh=((float) newHeight) /height;

        Matrix ma = new Matrix();
         ma.postScale(scalarw, scalarh);

         Bitmap res = Bitmap.createBitmap(imagen, 0, 0,
              width, height, ma, true);

         objreCReferencias.RegristrarReferenciaDebilBitmap(res, objReferenciaDebilBitmaps);     
        objelementos.imgfotoVideo.setImageBitmap(res);
        //imagen.recycle();
        //res.recycle();
        objelementos.btnComentarios.setEnabled(true);
        objelementos.pgrprogreso.setVisibility(View.INVISIBLE);
        }else{
              int newWidth = activiadPricipal.getWindowManager().getDefaultDisplay().getWidth();
              int newHeight = newWidth-80;

              objelementos.imgfotoVideo.setImageBitmap(null);
              objelementos.imgfotoVideo.setMinimumHeight(newHeight);
              objelementos.imgfotoVideo.setMinimumWidth(newWidth);


            objelementos.btnComentarios.setEnabled(false);
            objelementos.pgrprogreso.setVisibility(View.VISIBLE);
        }
        objelementos.txtPost.setVisibility(View.INVISIBLE);
        objelementos.btnVerVideo.setVisibility(View.INVISIBLE);
        objelementos.txtFecha.setText(datossss.getFecha());



    }



    }

    if (datossss.getImagenAvatar()!=null){
         objelementos.imgAvatar.setImageBitmap(datossss.getImagenAvatar());
    }else{
         objelementos.imgAvatar.setImageResource(R.drawable.avatarpredeterminado);
    }


     objelementos.txtTitulo.setText(datossss.getTituloPost());



    return vistaFila;



      }

the objelementos equivalent viewholder

that's what I'm doing wrong? I might say, as is the proper way to use weak references for all images and are deleted when I do not need?

Was it helpful?

Solution

If you are using bitmaps in your app, don't forget to call bmp.recycle() as GC in android cannot recycle bitmaps (for < Android v4.0, From 4.0 onwards, bitmaps are part of dvm). Also see my answer on same problem. I have addressed many answers, it will definitely solve your problem. bitmap size exceeds Vm budget error android

OTHER TIPS

Seems that your adapter is not efficient. Did you implement the ViewHolder like in the api Demos? You could edit your post and paste your adapter there, so we can see if that's the problem.

I think the problem is with loading the images, if you are loading the images without recycle, then it will always show OutOfMemoryError. So before you render the image, kindly try to use the below code to scale down the image:

    /*
     * Function used to reduce the size of the image to avoid memory out of
     * bound exception.
     */
    public static Bitmap decodeFile(String f) {
        try {
            // Decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            BitmapFactory.decodeStream(new FileInputStream(f), null, o);
            // The new size we want to scale to
            final int REQUIRED_SIZE = 150;
            // Find the correct scale value. It should be the power of 2.
            int scale = 1;
            while (o.outWidth / scale / 2 >= REQUIRED_SIZE
                    && o.outHeight / scale / 2 >= REQUIRED_SIZE)
                scale *= 2;

            // Decode with inSampleSize
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize = scale;
            return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
        } catch (FileNotFoundException e) {

        }
        return null;
    } 

Keep in mind that by scaling down the image quality will be slightly reduced.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top