我正在追踪我的 Xamarin Android 项目中的内存使用情况和泄漏情况,并决定从其中一个简单页面开始。
启动仪表板/启动 Activity 时,我有 21.790 MB 的已分配内存和 26.016 MB 的堆大小。
当我打开帮助 Activity 时,我只是使用 OnCreate 方法创建一个 Activity ,如下所示:
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.HelpActivity);
ActionBar.SetDisplayHomeAsUpEnabled(true);
_quickstartGuideLinearLayout = FindViewById<LinearLayout>(Resource.Id.quickstart_guide_layout);
_quickstartGuideLinearLayout.Click += ViewQuickstart;
_usermanualLinearLayout = FindViewById<LinearLayout>(Resource.Id.user_manual_layout);
_usermanualLinearLayout.Click += ViewUserManual;
}
然后在 OnDestroy 中:
protected override void OnDestroy()
{
if (_quickstartGuideLinearLayout != null)
{
_quickstartGuideLinearLayout.Click -= ViewQuickstart;
_quickstartGuideLinearLayout.Dispose();
_quickstartGuideLinearLayout = null;
}
if (_usermanualLinearLayout != null)
{
_usermanualLinearLayout.Click -= ViewUserManual;
_usermanualLinearLayout.Dispose();
_usermanualLinearLayout = null;
}
base.OnDestroy();
}
当显示帮助 Activity 时,内存使用量将上升到 22.102 MB,而当我单击返回或操作栏向上按钮时,它只会下降到 22.078 MB。
如果帮助 Activity 被销毁,为什么它不会回到 21.790 MB?
最佳答案
我似乎已经通过将 Dispose() 添加到我的 OnDestroy() 来修复它,如下所示:
protected override void OnDestroy()
{
base.OnDestroy();
Dispose();
}
编辑: 没关系,这似乎完全是因为我调用了 GC.Collect() 和 Dispose()。删除 Dispose() 没有负面影响,所以我猜我原来的问题只是基于这样一个事实,即少量无关紧要的内存增加不会导致 Mono GC 运行,这本来就是应该的样子。
编辑 根据 Xamarin 支持: 不必在 OnDestroy() 中的 Activity 上调用 Dispose。通过 FindViewById 找到的对象应该通过在每个对象上调用 .Dispose() 在 OnDestroy 中处理,并通过 -= MyEventHandler; 删除事件处理程序;
关于android - 简单 Activity 的 Xamarin Android 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23656378/