2015-11-20 7 views
6

私は、Xamarinクロスプラットフォームを使用して、iOSとAndroidの両方のアプリケーションを構築しています。私は「コア」と呼ばれるプロジェクトを1つ、次にiOSとAndroidのプロジェクトを持っています。Xamarin androidとiosでスレッドをスリープする方法は?

共有「コア」プロジェクトでは、デバイスから現在の場所を取得しながら、作成した読み込みアニメーションを表示したいと思います。私は自分のlocationWatcherを取得して起動し、LocationWatcher.CurrentPositionを直接呼び出すことができますが、場所の更新を監視し始めたばかりなので、まだ場所を取得する時間がありません。

私の解決策は、起動後2秒間待ってから場所を取得することです。しかし、私は非同期的に待ってはいけません。待っている間UIをロックしておきたいです。これは、現在の位置がわかるまでユーザーが何もすることができないためです。

私は現在のループを持っていることによって、これを達成:

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

これは、Javaで単純に「のThread.sleep(2000年)、」

があるのだろう何かのための醜い「ハック」のように思えますこれを行う良い方法は?

+0

両方の答えはうまくいきますが、投稿されているように、実際には**悪い**実用的ですあなたのメインのUIスレッドをブロックするために、余分なUIブロッキングがOSによって終了されたアプリケーションを取得し、それがアプリケーション提出を失敗させる原因になることを覚えておいてください。 IMO、スクリーンにthumperを置き、非同期の呼び出しをする... – SushiHangover

+0

いいコメント、私は主にUIスレッドをブロックしないようにしようとしています。なぜなら、ロードアニメーションを正しく動作させることができなかったからです。実際に結果を待っている間にユーザーが激しくクリックしていました。私はその作業を "待っているタスク。Delay(ms)"で試してみます。 – JavaDevSweden

答えて

4

を行う必要があるでしょうスレッドをブロックするマルチプラットフォームの方法:

Task.Delay(ms).Wait() 
1

UIスレッドをブロックすることは、デバイスが「応答していない」とマークする原因となる可能性があるためです。また、ポジションが2秒以内に決定されることは保証されていないので、あなたの提案は部分的な修正にすぎません。その後、

あなたが本当にやりたいだろうが入力を与える可能性を無効にすることで、UIの入力をブロックすることである(あなたのUI要素を無効にする方法があるはず)とジオロケーションサービスからのコールバックがあるかどうかが判断した場合に表示さあなたの場所。コールバックで、UI要素を再度有効にします。このようなコールバックが存在しない場合は、RunOnUIThread/InvokeOnMainThreadを使用してUIスレッドで同期して位置参照を実行します。これにより、スレッドは返されるまでブロックされます。

あなたはとにかくあなたのソリューションを進めて行きたい場合は、

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

は、トリックを行う必要がありますが、私は本当にはそれをやっに対してお勧めします。あなたが本当にHERESにmainthreadをブロックすることを読んだ後

:iOSでは、あなたはXamarinフォームでのマルチプラットフォームな方法が

await Task.Delay(ms); 

編集になり

InvokeOnMainThread(() => Thread.Sleep(2000)); 
関連する問題