首页 > 解决方案 > Xamarin Android 活动/片段没有被垃圾收集

问题描述

我正在构建一个 Xamarin Android 应用程序。这个应用程序似乎比通常的 java/kotlin 应用程序消耗更多的内存。我了解 Xamarin 框架本身使用了一些内存。我做了一些测试来检查对象是否被垃圾收集。

为了测试这一点,我向不同的对象添加了析构函数 ~MyClass(){ },放置断点,我可以看到 C# 对象被 GC 声明。在 Fragment/Activity 中,即使在OnDestroy(). 显示这一点的最简单示例是SplashActivity刚刚启动MainActivity我的应用程序。

  [Activity(Label = "@string/app_name", MainLauncher = true, LaunchMode = Android.Content.PM.LaunchMode.SingleTop, ScreenOrientation = Android.Content.PM.ScreenOrientation.Portrait, Theme = "@style/SplashTheme")]
  public class SplashActivity : AppCompatActivity
  {
    MyCSharpClass myObject; // this is not garbage collected
 
    protected override void OnCreate(Bundle bundle)
    {
        myObject = new MyCSharpClass();
     
        base.OnCreate(bundle);
        var intent = new Intent(this, typeof(MainActivity));
        StartActivity(intent);
        Finish();
    }
   
    protected override void OnDestroy() //this is called
    {
        base.OnDestroy();
    }

    ~SplashActivity() // this is not called
    {

    }
}

OnDestroy被立即调用但析构函数~SplashActivity()永远不会被调用。所以片段/活动和它的纯 C# 属性/字段似乎保留在内存中。我知道这些是Java.Lang.Object类型,但我希望 Android 和 C# 垃圾收集器一起工作以清除对象。

SplashActivity制作和myObject从记忆中删除的正确方法是什么?

标签: c#androidxamarinxamarin.androidgarbage-collection

解决方案


推荐阅读