0

I have a memoryleak in my app and according to the debugger in Eclipse it seems to be in the onPostExecute-method in Asynctask.

Its all about decoding bitmaps and put those (9) into a scrollview. The scrollView is in turn put into an AlertDialog. (AlertDialog.Builder). This is done in the onPostExecute-method.

I THINK I have made everything one can do.

  • the class that extending Asynctask is an static inner class.
  • made a weakreference of the class extending Asynctask.
  • decoding bitmaps efficiently (i.e. scalind down those to fit the actual screensize and as well recycling those when needed).
  • made a weakreference of every object in the asynctask.

I post the code here. Did I miss something crucial? Why is weakreferences not working at all? Everytime these 9 bitmaps are loaded into the scrollView - approx. 1000 new object are added to the total number of object. At the same time heap is growing, slowly though.

    private WeakReference <ImageView> mImageV;
    private WeakReference <Bitmap[]> bitmapV;
    private WeakReference <AlertDialog.Builder> alertaddV;
    private WeakReference <View> viewV;


protected void onPostExecute(Bitmap[] bitmap) { 

                    if (view == null) { 
                        view = factory.inflate(R.layout.alertviews4, null);
                        viewV = new WeakReference <View> (view);
                    }


                    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) viewV.get().findViewById(R.id.img1);
                    mImageV = new WeakReference <ImageView> (mImage);
                    mImageV.get().setImageBitmap(weakBitmap0.get());

                    mImage = (ImageView) viewV.get().findViewById(R.id.img2);
                    mImageV = new WeakReference <ImageView> (mImage);
                    mImageV.get().setImageBitmap(weakBitmap1.get());

                    mImage = (ImageView) viewV.get().findViewById(R.id.img3);
                    mImageV = new WeakReference <ImageView> (mImage);
                    mImageV.get().setImageBitmap(weakBitmap2.get());

                    mImage = (ImageView) viewV.get().findViewById(R.id.img4);
                    mImageV = new WeakReference <ImageView> (mImage);
                    mImageV.get().setImageBitmap(weakBitmap3.get());

                    mImage = (ImageView) viewV.get().findViewById(R.id.img5);
                    mImageV = new WeakReference <ImageView> (mImage);
                    mImageV.get().setImageBitmap(weakBitmap4.get());

                    mImage = (ImageView) viewV.get().findViewById(R.id.img6);
                    mImageV = new WeakReference <ImageView> (mImage);
                    mImageV.get().setImageBitmap(weakBitmap5.get());

                    mImage = (ImageView) viewV.get().findViewById(R.id.img7);
                    mImageV = new WeakReference <ImageView> (mImage);
                    mImageV.get().setImageBitmap(weakBitmap6.get());

                    mImage = (ImageView) viewV.get().findViewById(R.id.img8);
                    mImageV = new WeakReference <ImageView> (mImage);
                    mImageV.get().setImageBitmap(weakBitmap7.get());

                    mImage = (ImageView) viewV.get().findViewById(R.id.img9);
                    mImageV = new WeakReference <ImageView> (mImage);
                    mImageV.get().setImageBitmap(weakBitmap8.get());

                    mImageV.get().getDrawable().setCallback(null);

                    alertaddV.get().setView(viewV.get());

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

                    public void onClick(DialogInterface dlg, int sumthin) {

                    }
                });
                alertaddV.get().show();

            }
Björn Hallström
  • 3,775
  • 9
  • 39
  • 50
  • I am now trying to lift some code from onPostExecute and put it in doInBackground-method. Could it be a possible solution? Should one be catious to put code in the onPostExecute-method? – Björn Hallström Jul 10 '13 at 17:36

1 Answers1

0

It seems I made success on this - that is lifting out code from onPostExecute-method to doInBackground-method. The code I lifted out was:

  • inflating the xml-file.
  • findViewById.
Björn Hallström
  • 3,775
  • 9
  • 39
  • 50