c# - 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# - 用于存储 SynchronizationContext 或其他视图模型对象以编组到 Ui 线程上的任何普遍接受的模式?
- python - DNN,targets[3] 超出范围错误
- php - gcloud应用引擎中的子文件夹?
- vue.js - VueJS - 将数据传递给具有现有行的组件
- typescript - tsc - 用于轻型终端的漂亮格式
- laravel-5.5 - Laravel5 显示表计数
- c++ - 在 C++ 中返回映射的函数
- c++11 - 如何在 C++ 中对多个变量使用测试相同的条件
- or-tools - Google Ortools - 路由示例的问题
- swift - 使用 xcode 和 swift 向您的应用程序添加年龄限制的最佳方法是什么