0

AsyncTask クラスと onPostExecute メソッドに派生させたアプリにメモリリークがあります。onPostExcecute メソッドは、縮小された 9 つのビットマップを受け取り、それらをスクロールビューに配置します。スクロールビューはアラートダイアログに入れられます。

このメモリリークを止める方法はありますか? 9 つのビットマップすべての弱参照を作成しようとしましたが、成功しませんでした。

キャッシングは代替手段ですか?

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

}

4

1 に答える 1

0

API レベル < 11 の場合、ビットマップは難しいトピックです。それらはアプリのヒープ制限までカウントされますが、GC によって単純に収集されるわけではありません。ベスト プラクティスは、bitmap.recycle() を呼び出してポインターを null 化し、GC が参照を収集できるようにすることです。

于 2013-07-04T22:02:21.607 に答える