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
Memory overflow android
-
04-12-2021 - |
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?
Solution
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.