繁体   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