2015-11-20 9 views
6

Ich baue eine Anwendung für iOS und Android mit Xamarin Cross-Plattform. Ich habe ein Projekt namens "Core", und dann eins für iOS und eins für Android.Wie schlafen Thread in Xamarin Android und iOS?

Im freigegebenen "Core" -Projekt möchte ich eine Ladeanimation anzeigen, die ich gemacht habe, während ich den aktuellen Standort vom Gerät abgerufen habe. Ich kann meinen locationWatcher holen, ihn starten und LocationWatcher.CurrentPosition direkt aufrufen, aber da er gerade nach Standortaktualisierungen gesucht hat, hat er noch keine Zeit, einen Standort zu bekommen.

Meine Lösung ist, warten Sie 2 Sekunden nach dem Start und dann die Position zu bekommen. Ich möchte jedoch nicht asynchron warten. Ich möchte, dass die Benutzeroberfläche während des Wartens gesperrt wird. Dies liegt daran, dass der Benutzer nichts tun kann, bis die aktuelle Position bekannt ist.

Dies erreiche ich zur Zeit durch eine Schleife mit:

DateTime startTime = DateTime.Now(); 
while ((DateTime.Now() - startTime).TotalMilliseconds() < 2000) { 
    //Locking the UI here, but it's what I want so it's ok. 
} 

Dies scheint wie eine hässliche 'Hack' für etwas, das einfach in Java würde "Thread.sleep (2000)" sein

Gibt es ein besserer Weg dies zu tun?

+0

Beide Antworten funktionieren, aber wie man gepostet, es ist eine wirklich ** schlechte ** Praktik Wenn Sie Ihren Haupt-UIhread blockieren möchten, können Sie sich daran erinnern, dass die Sperrung der Benutzeroberfläche dazu führen kann, dass die App vom Betriebssystem beendet wird und sogar die App-Übermittlung fehlschlägt. IMO, Setzen Sie einen Klopfer auf den Bildschirm und machen Sie einen asynchronen Anruf ... – SushiHangover

+0

Tolle Kommentare, ich werde versuchen, den Haupt-UI-Thread nicht zu blockieren, da ich es hauptsächlich getan habe, weil ich die Ladeanimation nicht richtig funktionieren konnte, so Die Nutzer klickten wild weg, während sie eigentlich nur auf Ergebnisse warten mussten. Ich werde versuchen, das mit "await Task.Delay (ms)" zu arbeiten. – JavaDevSweden

Antwort

4

Die Multi-Plattform Art und Weise mit Xamarin Forms wäre

await Task.Delay(ms); 

bearbeiten zu tun haben multiplatform Weg, um ein Thema zu blockieren:

Task.Delay(ms).Wait() 
1

Das Blockieren des UI-Threads ist eine schlechte Übung, da es unter anderem dazu führen kann, dass das Gerät die App als "nicht reagiert" markiert. Es ist auch nicht garantiert, dass die Position in zwei Sekunden ermittelt wurde. Im besten Fall ist Ihr Vorschlag nur eine Teillösung.

Was Sie wirklich tun wollen, ist die UI-Eingabe zu blockieren, indem Sie die Möglichkeit deaktivieren, Eingaben zu geben (es sollte Methoden geben, um Ihre UI-Elemente zu deaktivieren) und dann zu sehen, ob es einen Rückruf vom Geolocation-Service gibt Ihr Standort. Aktivieren Sie im Callback die UI-Elemente erneut. Wenn ein solcher Rückruf nicht vorhanden ist, führen Sie die Standortsuche synchron mit RunOnUIhread/InvokeOnMainThread im Benutzeroberflächenthread durch, sodass der Thread nur blockiert wird, bis er zurückgegeben wird.

Wenn Sie sowieso voraus mit Ihrer Lösung gehen,

RunOnUiThread(() => Thread.Sleep(2000)); 

sollte es tun, aber ich empfehlen wirklich gegen das zu tun.

Nach der Lektüre, dass Sie wirklich blockieren wollen den Mainthread heres das: Auf iOS-Geräten finden Sie

InvokeOnMainThread(() => Thread.Sleep(2000)); 
Verwandte Themen