2013-07-10 2 views
0

У меня есть memoryleak в моем приложении, и в соответствии с отладчиком в Eclipse он, похоже, находится в onPostExecute-методе в Asynctask.Memoryleak in onPostExecute-метод AsyncTask

Его все о декодировании растровых изображений и поместите их (9) в прокрутку. ScrollView в свою очередь помещается в AlertDialog. (AlertDialog.Builder). Это делается в методе onPostExecute.

Я ДУМАЮ, Я сделал все, что можно сделать.

  • класс, расширяющий Asynctask, является статическим внутренним классом.
  • сделал слабый отклик класса, расширяющего асинтаску.
  • декодирование растровых изображений эффективно (то есть сканирование вниз, чтобы соответствовать фактическим экранам, а также их утилизации, когда это необходимо).
  • сделал слабую оценку каждого объекта в асинтете.

Я размещаю код здесь. Я пропустил что-то важное? Почему слабые ссылки не работают вообще? Каждый раз, когда эти 9 растровых изображений загружаются в scrollView - прибл. К общему числу объектов добавляется 1000 новых объектов. В то же время куча растет медленно, хотя.

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(); 

      } 
+0

Теперь я пытаюсь поднять некоторый код из onPostExecute и поместить его в doInBackground-method. Может ли это быть возможным решением? Следует ли ставить код в метод onPostExecute? –

ответ

0

Кажется, я добился успеха в этом - это вывод кода из метода onPostExecute в doInBackground-method. Код, который я снял, был:

  • раздувание xml-файла.
  • findViewById.