Windows Phone - 使用OnNavigatedFrom NavigationEventArgs传递数据。有内存泄漏吗?

时间:2013-10-03 04:41:18

标签: c# silverlight windows-phone-7

所以我的场景是page1.xaml有一个可点击的项目列表。比如,项目#1,#2,#3。在点击它们中的任何一个时,向用户呈现page2.xaml(例如,用户需要在看到项目#1,#2或#3的内容之前登录)。

因此,page2.xaml有一个“登录”按钮。单击应用程序应该将用户登录,并显示“下一页”。 “下一页”可以是项目#1,#2或#3的内容。

我不想将下一页存储为相对URL的字符串,例如,因为“下一页”可能需要参数。例如,要显示项目#2,我需要传递项目ID和一堆其他参数。

所以,我需要以一种知道“下一页”的方式设置page2.xaml,以及导航到下一页时要传递的参数。

这是我提出的代码...... 我们有第1页。

public partial class Page1 : PhoneApplicationPage
{
    public Page1()
    {
        InitializeComponent();
    }
private object[] parametersForNextPage;
protected override OnNavigatedFrom(NavigationEventArgs e)
{
        if (e.Content is Page2 )
        {
            if (parametersForNextAction != null)
            {
                var mm = (Page2)e.Content;
    // The reason why I need to set mm.NextPage and mm.parameters is because the NextPage could be any page
                mm.NextPage = HandleActionFunc; // This is some another function that will be called after Page2        
                mm.parameters = parametersForNextPage; // HandleActionFunc needs parameters
            }
        }
}
    private void Item_Click(object sender, RoutedEventArgs e)
{
    var control = (SomeRandomUserControlDefinedByMe)sender;
            parametersForNextPage = control.parameters;
    PageNavController.NavigateToPage2();
}
}

然后,我们有第2页:

public partial class Page2 : PhoneApplicationPage
{
public object[] parameters;
public Action<object[]> goToNextPage;
    public Page1()
    {
        InitializeComponent();
    }
    //...//
    private void Button_Click(object sender, EventArgs e)
{
    GoToNextPage(parameters);
}
}

现在,我的问题是......这会导致内存泄漏吗?

我对这个不太确定......

Page2将有一个参数字段,它是对Page1的引用 parametersForNextPage。

这是否意味着当Page1进入Page2时,Page2会阻止Page1收集垃圾,因为它持有对Page1字段的引用?

但即使是这种情况,当从Page2导航到“下一页”时......垃圾收集器现在会擦除Page1 AND Page2吗?

我可能一直不清楚,因为我不习惯在网上发布编码问题,但希望有人可以帮助我清除对这种情况下垃圾收集如何运作的疑虑。

这可能不是传递数据的最佳方式,顺便说一下,如果是这种情况,请随意向我建议另一种方法来执行此逻辑。

干杯

1 个答案:

答案 0 :(得分:1)

使用parametersForNextPage,您不会保留对Page1的引用,而是保留对Page1引用的对象的引用。因此垃圾收集器没有问题。

我更担心HandleActionFunc。您没有显示它,但如果它是在Page1上声明的实例方法,则阻止垃圾收集器清除Page1。

那就是说,你必须记住,只要它存在于后栈中,Page1将被保存在内存中。因此,如果您在Page2上导航时不打算清除后台堆栈,则无需担心,因为Page1将以任何方式保持活动状态。