【问题标题】:How to sleep thread in Xamarin android and ios?如何在 Xamarin android 和 ios 中休眠线程?
【发布时间】:2016-02-22 17:50:42
【问题描述】:

我正在使用 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)”

有更好的方法吗?

【问题讨论】:

  • 两个答案都有效,但正如一个帖子所说,阻塞主 UI 线程是一种非常糟糕的做法,记住过多的 UI 阻塞会使应用程序被操作系统终止甚至导致它无法提交应用程序。 IMO,在屏幕上放一个重击器并进行异步调用...
  • 很棒的 cmets,我会尽量不阻塞主 UI 线程,因为我大部分时间都在这样做,因为我无法让加载动画正常工作,所以用户在他们应该点击的时候疯狂地点击真的一直在等待结果。我将尝试使用“await Task.Delay(ms)”来完成这项工作。

标签: android ios datetime xamarin sleep


【解决方案1】:

Xamarin Forms 的多平台方式是

await Task.Delay(ms);

编辑:

读完你真的想阻塞主线程这里是阻塞线程的多平台方法:

Task.Delay(ms).Wait()

【讨论】:

    【解决方案2】:

    阻塞 UI 线程是不好的做法,因为它可能会导致设备将应用程序标记为“无响应”。您也不能保证在两秒钟内确定位置,所以在最好的情况下,您的建议只是部分修复。

    您真正想要做的是通过禁用提供输入的可能性来阻止 UI 输入(应该有禁用 UI 元素的方法),然后查看地理定位服务是否在确定您的地点。在回调中,重新启用 UI 元素。如果不存在这样的回调,则在 UI 线程上与 RunOnUIThread/InvokeOnMainThread 同步执行位置查找,这样线程只会被阻塞,直到它返回。

    如果你想继续你的解决方案,

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

    应该可以解决问题,但我真的建议不要这样做。在 iOS 上,您必须这样做

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-12
      相关资源
      最近更新 更多