У меня есть 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();
}
Теперь я пытаюсь поднять некоторый код из onPostExecute и поместить его в doInBackground-method. Может ли это быть возможным решением? Следует ли ставить код в метод onPostExecute? –