如何在 Xamarin android 和 ios 中休眠线程?
How to sleep thread in Xamarin android and ios?
我正在使用 Xamarin cross 平台为 iOS 和 Android 构建应用程序。我有一个名为 "Core" 的项目,然后一个用于 iOS,一个用于 Android。
在共享的 "Core" 项目中,我想展示我制作的加载动画,同时从设备获取当前位置。我可以获取我的 locationWatcher,启动它,然后直接调用 LocationWatcher.CurrentPosition,但是由于它刚刚开始监视位置更新,所以还没有时间获取任何位置。
我的解决方案是启动后等待2秒,然后获取位置。但是我不想异步等待,我希望 UI 在等待时被锁定。这是因为在当前 pos 状态 os 已知之前,用户不能做任何事情。
我目前通过循环来实现:
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)"
的东西来说,这似乎是一个丑陋的 'hack'
有更好的方法吗?
阻塞 UI 线程是一种不好的做法,因为除其他外,它可能会导致设备将应用程序标记为 "not responding"。你也不能保证位置会在两秒钟内确定,所以在最好的情况下你的建议只是部分修复。
你真正想要做的是通过禁用提供输入的可能性来阻止 UI 输入(应该有禁用你的 UI 元素的方法)然后看看是否有当确定您的位置时从地理定位服务回调。在回调中,重新启用 UI 元素。如果不存在这样的回调,则在 UI 线程上与 RunOnUIThread/InvokeOnMainThread 同步执行位置查找,这样线程只会阻塞到 returns.
如果你想继续你的解决方案,
RunOnUiThread(() => Thread.Sleep(2000));
应该可以解决问题,但我真的建议不要这样做。在 iOS,你必须做
InvokeOnMainThread(() => Thread.Sleep(2000));
使用 Xamarin Forms 的多平台方式是
await Task.Delay(ms);
编辑:
读完你真的想阻塞主线程这里是阻塞线程的多平台方法:
Task.Delay(ms).Wait()
我正在使用 Xamarin cross 平台为 iOS 和 Android 构建应用程序。我有一个名为 "Core" 的项目,然后一个用于 iOS,一个用于 Android。
在共享的 "Core" 项目中,我想展示我制作的加载动画,同时从设备获取当前位置。我可以获取我的 locationWatcher,启动它,然后直接调用 LocationWatcher.CurrentPosition,但是由于它刚刚开始监视位置更新,所以还没有时间获取任何位置。
我的解决方案是启动后等待2秒,然后获取位置。但是我不想异步等待,我希望 UI 在等待时被锁定。这是因为在当前 pos 状态 os 已知之前,用户不能做任何事情。
我目前通过循环来实现:
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)"
的东西来说,这似乎是一个丑陋的 'hack'有更好的方法吗?
阻塞 UI 线程是一种不好的做法,因为除其他外,它可能会导致设备将应用程序标记为 "not responding"。你也不能保证位置会在两秒钟内确定,所以在最好的情况下你的建议只是部分修复。
你真正想要做的是通过禁用提供输入的可能性来阻止 UI 输入(应该有禁用你的 UI 元素的方法)然后看看是否有当确定您的位置时从地理定位服务回调。在回调中,重新启用 UI 元素。如果不存在这样的回调,则在 UI 线程上与 RunOnUIThread/InvokeOnMainThread 同步执行位置查找,这样线程只会阻塞到 returns.
如果你想继续你的解决方案,
RunOnUiThread(() => Thread.Sleep(2000));
应该可以解决问题,但我真的建议不要这样做。在 iOS,你必须做
InvokeOnMainThread(() => Thread.Sleep(2000));
使用 Xamarin Forms 的多平台方式是
await Task.Delay(ms);
编辑:
读完你真的想阻塞主线程这里是阻塞线程的多平台方法:
Task.Delay(ms).Wait()