2013-10-03 45 views
0

所以我的情況是,page1.xaml有一個可點擊的項目列表。說,項目#1,#2,#3。點擊任何一個用戶後,用戶會看到page2.xaml(例如,用戶在查看項目#1,#2或#3的內容之前需要先登錄)。Windows Phone - 使用OnNavigatedFrom的NavigationEventArgs傳遞數據。有沒有內存泄漏?

因此,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); 
} 
} 

現在,我的問題是...可這導致內存泄漏?

我不太知道這一個...

第2頁將有一個參數域這是第1頁的 parametersForNextPage參考。

這是否意味着,當第1頁轉到第二頁,第二頁將保留第1頁被當作垃圾收集,因爲它保持爲第1頁的字段的引用?

但即使是這種情況,當從第2頁導航到「下一頁」時......垃圾回收器現在會擦除第1頁和第2頁?

我可能不清楚,因爲我不習慣在網上發帖編碼的問題,但我希望,有人能幫助我明確垃圾收集在這種情況下如何工作的疑慮。

這可能不是來傳遞數據,順便說一句最好的辦法了,如果是這樣的話,隨時提出我另一種方式來做到這一點的邏輯。

乾杯

回答

1

隨着parametersForNextPage,你不保持到第1頁的參考,你保持一個參考由第1頁引用的對象。因此垃圾收集器沒有問題。我會更擔心的是HandleActionFunc。你不顯示它,但是如果它是在Page1上聲明的實例方法,那麼它會阻止垃圾回收器清除Page1。

也就是說,你必須記住Page1將會一直保存在內存中,只要它存在於後備棧中。因此,如果您在第2頁導航時無意清除後備堆棧,則無需擔心,因爲Page1將以任何方式保持活動狀態。