Xamarin Android内存泄漏,操作简单

时间:2014-05-14 13:41:15

标签: android memory memory-leaks xamarin.android xamarin

我正在追踪我的Xamarin Android项目中的内存使用和泄漏,并决定从一个简单的页面开始。

启动仪表板/启动活动时,我有21.790 MB的已分配内存和堆大小为26.016 MB。

当我打开帮助活动时,我只需使用OnCreate方法创建一个活动,如下所示:

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();
        }

当显示帮助活动时,内存使用量将增加到22.102 MB,当我单击后退或操作栏向上按钮时,它将仅下降到22.078 MB。

如果帮助活动被破坏,为什么它不会回到21.790 MB?

1 个答案:

答案 0 :(得分:3)

我似乎通过将Dispose()添加到我的OnDestroy()来修复它,如下所示:

protected override void OnDestroy()
        {
            base.OnDestroy();
            Dispose();
        }

修改 没关系,似乎这纯粹是因为我将GC.Collect()与Dispose()一起调用。删除Dispose()没有任何负面影响所以我猜我的原始问题只是基于这样一个事实:小的无关紧要的内存增加量并没有导致Mono GC运行,这本质上是应该如何运行的。

修改 每个Xamarin支持: 没有必要在OnDestroy()上的活动上调用Dispose。通过FindViewById找到的对象应该通过在每个上调用.Dispose()以及通过 - = MyEventHandler删除事件处理程序来处理OnDestroy;