- Anwendung.Aktuelle.MainPage-vs-Navigation.PushAsync() vs-Navigation.PushModalAsync()
Entwickle ich einen Xamarin Forms-Anwendung (PCL), das NICHT mit einem zurück-button. Diese app hat drei Seiten : eine SplashScreenPage
um Daten zu laden, eine LoginPage
wenn der Benutzer anmelden muss und eine RootPage
was ist ein MasterDetailPage
. Ich habe mich gefragt, was die beste option, um zwischen den Seiten zu navigieren (um Speicherverluste zu vermeiden z.B.):
Erste Lösung:
Application.Current.MainPage = new ContentPage();
Zweite Lösung:
Navigation.PushAsync(new NavigationPage(new ContentPage()));
dann
NavigationPage.SetHasNavigationBar(this, false);
ClearNavigationStack();
Dritte Lösung
await Navigation.PushModalAsync(new NavigationPage(new ContentPage()));
dann
NavigationPage.SetHasNavigationBar(this, false);
ClearModalStack();
- Beste option in Bezug auf was? Keine dieser Optionen sollte memory leaks, wenn richtig implementiert (abgesehen von Xamarin.Formulare internen Leck-Probleme). Sie haben versucht, die Umsetzung dieser Lösungen noch und sehen, was passiert?
- Zunächst einmal vielen Dank für deine schnelle Antwort @WillDecker. Ich habe implementiert die erste Lösung, die ich vorgeschlagen hatte, und es schien gut. Aber ich Frage mich (mit Lösung), wenn der Vorherige aktuelle Seite wurde gelöscht, nachdem die aufrufende Anwendung.Aktuelle.MainPage = new ContentPage(); ich habe versucht, heute die Umsetzung der zweiten Lösung, aber der NavigationBar erschien, selbst wenn ich rief NavigationPage.SetHasNavigationBar(this, false); (vielleicht habe ich etwas falsch gemacht ?) Also versuchte ich die Dritte Lösung, die NavigationBar nicht mehr erscheinen, aber ich will klar den modal-stack und ich weiß nicht, was ist der beste Weg, das zu tun.
- Mit Bezug auf die erste Lösung, die Vorherige Seite sollte bereinigt weisen Sie, nachdem Sie Ihre neue Seite auf der Hauptseite. Ich glaube tatsächlich, dass wäre Ihre beste Wette in diesem Szenario.
- Danke ! Wissen Sie, was ist die Lösung, zum bereinigen der vorherigen Seite ? Mit der zweiten Lösung, die ich verwenden können, die RemovePage Methode der Navigation-Objekt, aber ich weiß nicht, wie zu tun, mit dem ersten.
- Ich wurde empfohlen, um dem Garbage Collector die Methode Sammeln und entsorgen von Elementen, die sind nicht mehr in Gebrauch (dann deaktivieren Sie die vorherigen Seite). Was denkst du über diese Lösung @WillDecker ?
InformationsquelleAutor Nicolas Bodin-Ripert | 2017-10-24
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beschreiben von @wird-decter keine der oben genannten Lösungen könnte Speicherverluste verursachen, wenn korrekt implementiert.
Können Sie jede der oben genannten Lösungen. Und in der Regel brauchen Sie nicht zu tun, alles zu löschen Vorherige Seite. Garbage Collector automatisch für Sie tun (Nicht sofort aber nach einiger Zeit auf eine bestimmte Bedingung basiert). Überlegen Sie zunächst, Lösung:
Wenn du nun weisen neue Seite wie diese.
Als "Page1" ist nicht mehr in Gebrauch, GC sammeln Seite1 Objekt nach einiger Zeit bei GC zu versuchen, um Speicherplatz gewinnen. Sie können auch GC.Collect() zu erzwingen, GC, um Speicherplatz freizugeben sofort, aber als GC.Collect () - operation ist teuer, also würde ich vorschlagen, Sie sollte nicht nennen es von deinem code, lieber optimieren Sie Ihren code, so brauchen Sie nicht, um es aufzurufen.
Aber wenn Ihre Seite abonnieren, um ein Ereignis und nicht Abmelden, es dann in diesem Fall GC nicht erheben können, dass die Seite sogar, wenn Sie anrufen GC.Collect () - Methode. So stellen Sie sicher, dass Sie sich alle abonnierten event wie diesem:
(Sie können überspringen unsubscibe, wenn ein Ereignis-war abonnieren von xaml wie in diesem Fall Xamarin Form verwendet WeakReference)
Dadurch wird sichergestellt MainPage gesammelt von GC, wenn nötig.
Ich würde vorschlagen zu Lesen diese Artikel, um einen besseren Einblick bekommen, wie GC funktioniert in Xamarin und wie können Sie erhöhen die Leistung Ihrer Anwendung.
https://developer.xamarin.com/guides/cross-platform/deployment,_testing,_and_metrics/memory_perf_best_practices/
denke, die beste option, um zwischen den Seiten zu navigieren ist
in der App.cs
dann auf Login Erfolg klicken Sie:
Nicht brauchen, um hinzuzufügen, "NavigationPage.SetHasNavigationBar(this, false);"