2015-11-20 23 views
6

Sto costruendo un'applicazione per iOS e Android utilizzando la piattaforma cross Xamarin. Ho un progetto chiamato "Core", e poi uno per iOS e uno per Android.Come dormire thread in Xamarin Android e iOS?

Nel progetto "Core" condiviso voglio mostrare un'animazione di caricamento che ho creato, mentre recupera la posizione corrente dal dispositivo. Posso ottenere la mia posizione Watcher, avviarla e chiamare LocationWatcher.CurrentPosition direttamente, ma dal momento che ha appena iniziato a guardare gli aggiornamenti di posizione, non ha ancora avuto il tempo di ottenere alcuna posizione.

La mia soluzione è attendere 2 secondi dopo averlo avviato e ottenere la posizione. Comunque non voglio aspettare in modo asincrono, voglio che l'interfaccia utente sia bloccata mentre aspetto. Questo perché l'utente non dovrebbe essere in grado di fare nulla fino a quando non si conosce la posizione corrente.

Io attualmente a raggiungere questo avendo un ciclo:

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

Questo mi sembra un brutto 'Hack' per qualcosa che in Java sarebbe semplicemente "Thread.sleep (2000)"

C'è un modo migliore di farlo?

+0

Entrambe le risposte funzionano, ma come indicato in una pubblicazione, è davvero una cattiva pratica ** Per bloccare il thread principale dell'interfaccia utente, ricordare che il blocco dell'interfaccia utente in eccesso può far terminare l'app dal sistema operativo e persino causare il mancato invio dell'app. IMO, metti un thumper sullo schermo e fai una chiamata asincrona ... – SushiHangover

+0

Ottimi commenti, proverò a non bloccare il thread principale dell'interfaccia utente perché lo stavo facendo principalmente perché non riuscivo a far funzionare correttamente l'animazione di caricamento, quindi gli utenti stavano facendo clic selvaggiamente mentre avrebbero dovuto aspettare solo i risultati. Proverò a farlo funzionare con "attendi Task.Delay (ms)". – JavaDevSweden

risposta

4

Il modo multipiattaforma con forme Xamarin sarebbe quello di

await Task.Delay(ms); 

Edit:

Dopo aver letto che si vuole veramente bloccare la mainthread heres la modo multipiattaforma per bloccare una discussione:

Task.Delay(ms).Wait() 
1

Il blocco del thread dell'interfaccia utente è una cattiva pratica, poiché tra le altre cose il dispositivo potrebbe contrassegnare l'app come "non risponde". Inoltre, non è garantito che la posizione sarà determinata in due secondi, quindi nel migliore dei casi il tuo suggerimento è solo una correzione parziale.

Quello che vorrete veramente fare è bloccare l'input dell'interfaccia utente disabilitando la possibilità di dare input (ci dovrebbero essere metodi per disabilitare i vostri elementi dell'interfaccia utente) e poi vedere se c'è una richiamata dal servizio di geolocalizzazione quando ha determinato la tua posizione. Nel callback, riattivare gli elementi dell'interfaccia utente. Se tale callback non esiste, eseguire la ricerca della posizione in modo sincrono sul thread dell'interfaccia utente con RunOnUIThread/InvokeOnMainThread, in modo che il thread sia bloccato solo fino al suo ritorno.

Se si vuole andare avanti con la soluzione in ogni caso,

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

dovrebbe fare il trucco, ma ho davvero raccomandare contro farlo. Su iOS, dovrete fare

InvokeOnMainThread(() => Thread.Sleep(2000)); 
Problemi correlati