簡體   English   中英

如何在Xamarin android和ios中安裝線程?

[英]How to sleep thread in Xamarin android and ios?

我正在使用Xamarin跨平台為iOS和Android構建應用程序。 我有一個名為“Core”的項目,然后一個用於iOS,一個用於Android。

在共享的“核心”項目中,我想顯示一個加載動畫,同時從設備中獲取當前位置。 我可以獲取我的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)”來說,這似乎是一個丑陋的“黑客”

有沒有更好的方法呢?

使用Xamarin Forms的多平台方式將是

await Task.Delay(ms);

編輯:

在閱讀之后你真的想要阻止mainthread繼承阻止線程的多平台方式:

Task.Delay(ms).Wait()

阻止UI線程是不好的做法,因為除其他外,它可能導致設備將應用程序標記為“無響應”。 您也無法保證該位置將在兩秒內確定,因此在最好的情況下,您的建議只是部分修復。

您真正想要做的是通過禁用提供輸入的可能性來阻止UI輸入(應該有禁用UI元素的方法),然后在確定您的位置時查看地理定位服務是否有回調。 在回調中,重新啟用UI元素。 如果不存在這樣的回調,則使用RunOnUIThread / InvokeOnMainThread在UI線程上同步執行位置查找,以便僅在線程返回之前阻止該線程。

如果您想繼續使用您的解決方案,

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

應該做的伎倆,但我真的建議不要這樣做。 在iOS上,你必須這樣做

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM