我们有一个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的引用的其他原因?
编辑一种可能性是我们订阅了不止一次,但只取消订阅一次。我已经检查过调试/日志记录,我不认为是这种情况。我们对称订阅/取消订阅。
答案 0 :(得分:0)
事实证明我们订阅了两次(由于应用程序生命周期开始时页面的生命周期)。因此,单一取消订阅会留下订阅。
修复此问题解决了这个问题。