Xamarin android - OutOfMemory在创建位图和设置ImageView在视图页

本文关键字:设置 ImageView 视图 创建 android OutOfMemory Xamarin 位图 | 更新日期: 2023-09-27 18:06:59

我最近开始玩Xamarin-Android,发现当你使用ViewPagerImageViewBitmapOutOfMemoryError将发生非常快。

我已经创建了2个小的测试应用程序,其目的只是为了显示这种行为。一个应用程序是用Xamarin在C#中编程的,另一个是Java中一个常见的android项目。两个应用程序都包含一个包含20页(片段)的ViewPagerFragment再次包含一个ImageView,它获得一个红色的Bitmap集:

Bitmap bitmap = Bitmap.createBitmap(2000, 2000, Bitmap.Config.ARGB_8888);
bitmap.eraseColor(Color.RED);
mImageView.setImageBitmap(bitmap);

现在滑动页面,看看Android Studio内存监视器。如果你比较这两个应用程序,你会注意到通常的android应用程序的行为与预期一样,内存使用保持在一定的MB量。另一方面,Xamarin应用程序的内存随着每次滑动页面而增加,直到出现OutOfMemorError

所以我现在的问题是为什么会发生这种情况以及我如何防止OutOfMemoryError ?

我试着像下面这样创建Bitmap,但没有帮助:

using(var bitmap = Bitmap.CreateBitmap(2000, 2000, Bitmap.Config.Argb8888)) {
    bitmap.EraseColor(Color.Red);
    mImageView.SetImageBitmap(bitmap);
}

OnStop()方法中的一些位图回收和其他东西也没有改变任何东西:

public override void OnStop()
{
    base.OnStop();
    ((BitmapDrawable) mImageView.Drawable).Bitmap.Recycle();
    ((BitmapDrawable) mImageView.Drawable).Bitmap.Dispose();
    mImageView.SetImageBitmap(null);
    mImageView.Dispose();
}

你有什么建议吗?

Xamarin android - OutOfMemory在创建位图和设置ImageView在视图页

所以我能找到的问题的唯一解决方案是在OnStop()方法中手动调用垃圾收集,如下所示:

GC.Collect();

我不太喜欢这种方法,但它确实有效,而且似乎没有引起任何其他问题。