如何在销毁页面时删除邮件订阅

时间:2018-04-17 15:23:37

标签: xamarin xamarin.forms

我有一个订阅邮件的页面。当页面在内存中但不可见时,我仍然希望它接收消息。但是,如果重建UI,页面将被销毁 - 这也可能在页面不可见时发生。当页面被销毁时,我该如何取消订阅该消息?

这甚至是必要的吗?页面是否会在收集垃圾的时候取消订阅?

在调试器中检查,看起来好像逐渐删除了页面并且订阅随之而来。如果我打开几个相同类型的页面,那么响应的订阅者数量会逐渐减少。计数将高达十或十一,然后下降到三或四。

1 个答案:

答案 0 :(得分:1)

如果你正在使用Xamarin.Forms h5dump -n <filename>并在页面垃圾收集时订阅页面本身,它将不再被订阅。但是,垃圾收集实际运行可能需要一段时间,所以如果您有多个页面实例仍然存在,它们仍然会订阅您的邮件。

如果您对多页接收消息的可能性感到满意,那么它们最终会被gc'ed并且不会导致内存泄漏,因为您没有取消订阅,如果这是您所担心的。

如果您确实希望确保只有MessagingCenter中仍有NavigationStack页面的单个实例订阅了邮件,我会override OnParentSet并取消订阅。

protected override void OnParentSet()
{
    base.OnParentSet();

    if (Parent == null)
    {
        MessagingCenter.Unsubscribe<MainPage>(this, "message");
    }
}