如何在Xamarin Android和iOS中使线程休眠?

9
我正在使用Xamarin跨平台开发应用程序,同时支持iOS和Android。我的项目有三个部分,“Core”、“iOS”和“Android”。
在共享的“Core”项目中,我想要显示一个加载动画,同时获取设备当前位置。我可以获得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.
}

这似乎是在使用一种丑陋的“hack”方法,而在Java中这个操作只需要简单地使用“Thread.sleep(2000)”即可。
有没有更好的方法来实现这个功能?

两个答案都可以,但正如某位回帖者所说,阻塞主UI线程是一种非常糟糕的做法,要记住过多的UI阻塞可能会导致应用被操作系统终止甚至导致应用提交失败。在我看来,你可以在屏幕上显示一个提示并进行异步调用... - SushiHangover
很好的评论,我会尽量避免阻塞主UI线程,因为我之前大多数情况下都是这样做的,因为我无法使加载动画正常工作,所以用户在等待结果时会疯狂点击。我会尝试使用“await Task.Delay(ms)”来解决这个问题。 - JavaDevSweden
2个回答

6
使用Xamarin Forms的跨平台方式是:
await Task.Delay(ms);

编辑:

如果您真的想阻塞主线程,那么这是跨平台阻塞线程的方法:

Task.Delay(ms).Wait()

1
阻塞UI线程是不良实践,因为它可能会导致设备将应用标记为“无响应”。您也不能保证在两秒钟内已确定位置,所以在最好的情况下,您的建议只是部分修复。
您真正想做的是通过禁用UI元素的方法来阻止UI输入(应该有禁用UI元素的方法),然后查看地理位置服务是否有回调来确定您的位置。在回调中,重新启用UI元素。如果不存在这样的回调,请使用RunOnUIThread/InvokeOnMainThread在UI线程上同步执行位置查找,以便线程仅在返回时被阻塞。
如果您仍想继续使用您的解决方案,请注意:
RunOnUiThread(() => Thread.Sleep(2000));

这应该能解决问题,但我非常不建议这样做。在iOS上,你必须这样做。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接