2015-07-30 6 views
8

Wenn meine App zum ersten Mal gestartet wird, muss ich einige zuvor gespeicherte Daten laden. Wenn es existiert -> dann gehe auf die TabbedPage-Seite. Sonst eine Login-Seite.Wie kann ich diese asynchrone Methode in meinen Xamarin Forms aufrufen, wenn meine App startet?

Ich bin mir nicht sicher, wie kann ich meine asynchrone Methode in der App ctor oder sogar in einer anderen Methode aufrufen?

Wie kann ich das tun?

Hier ist mein Code ..

namespace Foo 
{ 
    public class App : Application 
    { 
     public App() 
     { 
      Page page; 

      LoadStorageDataAsync(); // TODO: HALP! 

      if (Account != null) 
      { 
       // Lets show the dashboard. 
       page = new DashboardPage(); 
      } 
      else 
      { 
       // We need to login to figure out who we are. 
       page = CreateAuthenticationPage(); 
      } 

      MainPage = page; 
     } 

    ... snip ... 
} 

Warum ist LoadStorageDataAsync async? Weil es using the library PCLStorage ist und das alles async ist.

Kann mir bitte jemand helfen?

Antwort

10

As far as the docs say, haben Sie die Application.OnStart Ereignis, das Sie überschreiben können:

Anwendungsentwickler diese Methode überschreiben Aktionen auszuführen, wenn die Anwendung startet.

Sie können Ihre async Methode dort ausführen, wo es eigentlich erwartet werden können:

public override async void OnStart() 
{ 
    await LoadStorageDataAsync(); 
} 
1

Constructors nicht async sein kann, aber Ereignishandler sein kann. Wenn Sie können Sie diese Logik auf die OnStart Event-Handler (oder eine geeignetere) bewegen sollte:

public override async void OnStart (EventArgs e) 
{ 
    // stuff 
    await LoadStorageDataAsync(); 
    // stuff 
} 

Wenn Sie nicht können, haben Sie keine bessere Wahl als einfach blockiert synchron zu dieser Aufgabe Holen Sie sich das Ergebnis. Sie sollten jedoch beachten, dass dies zu Deadlocks führen kann.

+0

Wenn Sie bemerkt haben, erben ich von 'Application'. Es gibt keinen 'async void OnStart (...) 'override? –

+1

Ahh -> es ist 'öffentliche Überschreibung async void OnStart()' –

+0

@ Pure.Krome Ich versuche, keine Modifikatoren zu enthalten, da sie nicht wirklich mit den meisten Antworten verwandt sind. – i3arnon

5

Machen Sie einen Schritt zurück und überlegen Sie, wie die Benutzeroberfläche funktioniert. Wenn Ihre App anfänglich angezeigt wird, erstellt das Framework Ihr ViewModel und View und zeigt dann so bald wie möglich etwas sofort an. Das ist ein unpassender Ort für Netzwerkaktivitäten.

Stattdessen, was Sie tun sollten, ist Start der asynchrone Betrieb und dann (synchron) laden und zeigen eine "Laden" -Seite. Wenn der asynchrone Vorgang abgeschlossen ist, können Sie auf Ihre anderen Seiten (oder auf eine "Fehler" -Seite wechseln, wenn der Benutzer z. B. keinen Netzwerkzugriff hat).

Ich bin mir nicht sicher, ob Xamarin Forms in der Lage ist, Daten an ein Seitenobjekt zu binden, aber wenn dies der Fall ist, kann mein NotifyTaskCompletion type hilfreich sein.

0

Die Verwendung von asynchronen Methoden in einem Konstruktor wird als fehlerhafter Code angesehen. Sie sollten in einem Klassenkonstruktor keine asynchronen Methoden verwenden.

Sie könnten versuchen, es zu ändern Deadlocks zu vermeiden:

Func<Task> task = async() => { 
    await YourCustomMethodAsync().ConfigureAwait(false); 
}; 
task().Wait(); 

... aber ich werde es nicht empfehlen.

Verwandte Themen