0

アプリにメモリリークがあり、Eclipse のデバッガによると、Asynctask の onPostExecute メソッドにあるようです。

ビットマップをデコードし、それら(9)をスクロールビューに入れることがすべてです。次に、scrollView は AlertDialog に入れられます。(AlertDialog.Builder)。これは onPostExecute メソッドで行われます。

できることはすべてやったと思います。

  • Asynctask を拡張するクラスは static 内部クラスです。
  • Asynctask を拡張するクラスの弱参照を作成しました。
  • ビットマップを効率的にデコードします (つまり、実際の画面サイズに合わせてビットマップを縮小し、必要に応じて再利用します)。
  • 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();

            }
4

1 に答える 1

0

私はこれで成功したようです.onPostExecute-methodからdoInBackground-methodにコードを持ち上げています. 私が持ち上げたコードは次のとおりです。

  • xml ファイルを膨張させます。
  • findViewById.
于 2013-07-10T18:39:54.073 に答える