回收Bitmap不释放内存

Ada*_*dam 7 android memory-leaks bitmap xamarin.android xamarin

Activity参加了TabHost另外3项活动.因此,这些总是活着的(或处于"暂停"状态).

第一个活动有四个不同的图像(每个约250kb),它们检索大量内存(大约80MB.只是指出,我加载屏幕所需的最小尺寸,layout_weight如果有帮助我正在使用),所以我想要最小化所需的内存量.

我已经尝试删除OnPause状态上的图像并再次设置它们OnResume,但我没有运气,这是我尝试做的一个例子:

 imageView.Drawable.Callback = null;
 ((BitmapDrawable)imageView.Drawable).Bitmap.Recycle();
 imageView.Drawable.Dispose();
 imageView.SetImageDrawable(null);
 imageView.SetImageBitmap(null);
 GC.Collect();
Run Code Online (Sandbox Code Playgroud)

我不知道删除Bitmapon OnPause是否是最佳策略,但它应该有效.我不明白为什么ImageView不收集GC(因为没有外部参考)

编辑 这是我加载图像的方式.即使我将图像放在xml文件上,它也不起作用.此外,我不关心这段代码,我只想处理位图.

       void SetBackgroundImages(int imageId, int resId, float width, float height) {
        var imageView = FindViewById<ImageView>(imageId);
        using (var bitmap = DecodeSampledBitmapFromResource(Resources, resId, width, height))
            imageView.SetImageBitmap(bitmap);

    }
    public static Bitmap DecodeSampledBitmapFromResource(Resources res, int resId, float reqWidth, float reqHeight) {

    var options = new BitmapFactory.Options {InJustDecodeBounds = true};
    using (var b = BitmapFactory.DecodeResource(res,resId,options)){}
        options.InSampleSize = CalculateInSampleSize(options, reqWidth, reqHeight);
        options.InJustDecodeBounds = false;
        return BitmapFactory.DecodeResource(res, resId, options);
    }
Run Code Online (Sandbox Code Playgroud)

Ada*_*dam 7

最后,java.lang.System.gc()在删除图像后调用诀窍.