Xamarin.Forms安卓应用程序 - 事件处理程序保持PageModel被引用,尽管取消订阅

时间:2017-12-11 19:00:10

标签: events memory-leaks xamarin.forms

我们有一个Xamarin.Forms Android应用程序,其中我们在加载页面上显示进度,进度值由另一个类的事件发送。

我们正在使用FreshMvvm,它具有PageModel中可用的ViewIsAppearing和ViewIsDisappearing覆盖。

因此我们订阅了ViewIsAppearing,并在ViewIsDisappearing中取消订阅 - 我们还取消订阅PrepareForDispose方法,该方法旨在确保PageModel已清理,以便可以处理它。

代码如下。 ProgressManager由IoC提供

        protected override void ViewIsAppearing (object sender, EventArgs e)
        {
            base.ViewIsAppearing (sender, e);

            ProgressManager.ProgressEvent += ProgressManager_ProgressEvent;

        }

        protected override void ViewIsDisappearing (object sender, EventArgs e)
        {
            base.ViewIsDisappearing (sender, e);

            RemoveEventHandlers();
        }

        public override void PrepareForDispose()
        {
            RemoveEventHandlers();
            base.PrepareForDispose();
        }

        private void RemoveEventHandlers()
        {
            ProgressManager.ProgressEvent -= ProgressManager_ProgressEvent;
        }

问题在于,在检查Profiler中的对象时,我们可以看到LoadingPageModel仍在内存中,因为在 ViewIsAppearing 中创建的 EventArgs (检查“ “在Profiler中路径到根”告诉我们这个。)

当我记录/调试应用程序时,我可以看到 RemoveEventHandlers 已被调用。

_ProgressManager.ProgressEvent - = ProgressManager_ProgressEvent; _无法删除处理程序,还是我们仍然从EventArgs获得对PageModel的引用的其他原因?

编辑一种可能性是我们订阅了不止一次,但只取消订阅一次。我已经检查过调试/日志记录,我不认为是这种情况。我们对称订阅/取消订阅。

1 个答案:

答案 0 :(得分:0)

事实证明我们订阅了两次(由于应用程序生命周期开始时页面的生命周期)。因此,单一取消订阅会留下订阅。

修复此问题解决了这个问题。