gpt4 book ai didi

c# - 在 Xamarin.Forms Device.BeginInvokeOnMainThread() 中不显示来自通知回调的消息框*仅*在物理设备上的发布配置中

转载 作者:IT王子 更新时间:2023-10-29 04:06:42 24 4
gpt4 key购买 nike

我正在将我现有的 (swift) iOS 物理治疗应用程序“On My Nerves”重写为 Xamarin.Forms。这是一个计时器应用程序,可以帮助神经受损的人(比如我!)进行脱敏练习。你有这些“ Fabric ”(例如羽毛),其中每种 Fabric 都有“x”秒倒计时。当 fabric 的计时器达到 0 时,会出现一个消息框,提示“时间到了”。用户点击确定,下一个织物开始倒计时。冲洗并重复列表中的所有织物。这是一个 video showing the workflow .相信我视频中的用户体验。

这是我的 sample app code demonstrating this behavior .

DoSomethingForNow 方法(请原谅我的命名策略)是来自 NotificationService 的回调(请参阅第 65 行 - 没有足够的 SO 代表点用于直接链接),它是在计时器启动时创建的,以防万一应用程序获取背景。

在 Device 上的 Release 模式下不起作用的特定调用位于第 115 行

Device.BeginInvokeOnMainThread(
async () => await ShowAlertAndWaitForUser(currentFabricCount));

async () => await ShowAlertAndWaitForUser(currentFabricCount)) 在 iOS 模拟器上的调试和发布配置以及设备上的调试配置中按预期工作。

但是,指示时间已到的消息框不会出现在物理设备上的发布配置中。我不明白为什么 Device.BeginInvokeOnMainThread() 在设备上的发布配置中不起作用。到底是怎么回事?

旁注重新使用 Device.StartTimer()

我早期从 Device.StartTimer() 切换到 James 的 FrenchPressTimer 解决方案(参见 jamesmontemagno/FrenchPressTimer)的原因是因为我需要一种方法来取消/停止/任何 Device.StartTimer() 以防用户需要暂停或停止倒计时在应用程序上。

Device.StartTimer() 代码在模拟器和设备上的所有配置上对我来说都很好,谢天谢地有人展示了我如何取消 Device.StartTimer(谢谢!)。如果您想查看此有效解决方案,请查看 GitHub 上的 saraford/Device-StartTimer-Working-Xamarin。

我的具体问题是,为什么 Device.BeginInvokeOnMainThread() 在物理设备上从发布配置中的通知回调调用时不显示消息框。

我还尝试了不同的链接器组合。没有效果。

最佳答案

这是一个可行的答案,但正如@JamesMallon 所提到的,不要使用它:

Device.BeginInvokeOnMainThread(ShowAlertAndWaitForUser(currentFabricCount).Result);

在代码未在主/UI 线程中运行的情况下,您的问题很常见。似乎您在主线程上开始调用,但 UI 线程实际上并未读取该行,而是另一个线程正在执行您需要的操作。这也是为什么它有时有效而在其他时间无效的原因。

因此,与其在 UI 线程上执行整个 ShowAlertAndWaitForUser(),不如尝试在该线程上仅运行 DisplayAlert 函数。

关于c# - 在 Xamarin.Forms Device.BeginInvokeOnMainThread() 中不显示来自通知回调的消息框*仅*在物理设备上的发布配置中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46491815/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com