0

I have a memoryleak in my app that I derived to the AsyncTask-class and in the onPostExecute-method. The onPostExcecute-method receives 9 scaleddown bitmaps and put those into a scrollview. The scrollview is in turn put into an alertdialog.

Any suggestions how to stop this memory leak? I have tried to make weakreference of all 9 bitmaps without success.

Is cahcing an alternative?

protected void onPostExecute(Bitmap[] bitmap) {

if (view == null) { 
    view = factory.inflate(R.layout.alertviews4, null);
    alertadd = new AlertDialog.Builder(context);
}



WeakReference <Bitmap> weakBitmap0 = new WeakReference <Bitmap> (bitmap[0]);
WeakReference <Bitmap> weakBitmap1 = new WeakReference <Bitmap> (bitmap[1]);
WeakReference <Bitmap> weakBitmap2 = new WeakReference <Bitmap> (bitmap[2]);
WeakReference <Bitmap> weakBitmap3 = new WeakReference <Bitmap> (bitmap[3]);
WeakReference <Bitmap> weakBitmap4 = new WeakReference <Bitmap> (bitmap[4]);
WeakReference <Bitmap> weakBitmap5 = new WeakReference <Bitmap> (bitmap[5]);
WeakReference <Bitmap> weakBitmap6 = new WeakReference <Bitmap> (bitmap[6]);
WeakReference <Bitmap> weakBitmap7 = new WeakReference <Bitmap> (bitmap[7]);
WeakReference <Bitmap> weakBitmap8 = new WeakReference <Bitmap> (bitmap[8]);

mImage = (ImageView) view.findViewById(R.id.img1);
mImage.setImageBitmap(weakBitmap0.get());
mImage = (ImageView) view.findViewById(R.id.img2);
mImage.setImageBitmap(weakBitmap1.get());
mImage = (ImageView) view.findViewById(R.id.img3);
mImage.setImageBitmap(weakBitmap2.get());
mImage = (ImageView) view.findViewById(R.id.img4);
mImage.setImageBitmap(weakBitmap3.get());
mImage = (ImageView) view.findViewById(R.id.img5);
mImage.setImageBitmap(weakBitmap4.get());
mImage = (ImageView) view.findViewById(R.id.img6);
mImage.setImageBitmap(weakBitmap5.get());
mImage = (ImageView) view.findViewById(R.id.img7);
mImage.setImageBitmap(weakBitmap6.get());
mImage = (ImageView) view.findViewById(R.id.img8);
mImage.setImageBitmap(weakBitmap7.get());
mImage = (ImageView) view.findViewById(R.id.img9);
mImage.setImageBitmap(weakBitmap8.get());

alertadd.setView(view);

alertadd.setNeutralButton("Here!", new DialogInterface.OnClickListener() {

    public void onClick(DialogInterface dlg, int sumthin) {

    }
});
alertadd.show();

}

Björn Hallström
  • 3,775
  • 9
  • 39
  • 50

1 Answers1

0

For API level < 11, bitmaps are a difficult topic. They are counted to the heap limit of the app but not simply collected by the GC. The best practice would be to call bitmap.recycle() and nullify the pointer to allow the GC to collect the reference.

Johannes
  • 31
  • 2