You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin Forms中DisplayAlert在华为Y9 Prime(Android10)不显示且冻屏问题

问题根因定位

你这段代码的核心问题是对DisplayAlert返回的Task调用了Wait()方法,造成了UI线程同步上下文死锁:

  • DisplayAlert本身是异步方法,需要等待用户点击弹窗按钮后才会完成返回
  • 调用.Wait()会同步阻塞当前线程等待Task完成,而DisplayAlert必须运行在UI线程才能正常渲染弹窗,等于UI线程被自己的阻塞逻辑占住,根本没法完成弹窗渲染、响应用户点击操作,最终就表现为弹窗无法弹出、应用冻结无响应
  • Android 9上未触发问题是因为不同系统版本的Xamarin Android原生弹窗调度逻辑存在差异,刚好规避了死锁,本质上该写法本身就存在稳定性风险
修复方案

把同步等待.Wait()改成异步等待await即可,修改后代码如下:

if (LocalSession.Device.IDDevice == 0) // Does not exist as registered device
{
   // 注意:lambda表达式需要添加async修饰符
   Device.BeginInvokeOnMainThread(async () =>
   {
      await DisplayAlert("Atención", "No existe el dispositivo en el sistema. Consulte al administrador. IMEI:" + LocalSession.IMEI, "Aceptar");
      // 点击弹窗后的后续逻辑可写在此处
   });
}

如果移除了Device.BeginInvokeOnMainThread调用,也需要保证外层触发方法添加async修饰符,直接用await DisplayAlert(...)调用即可,禁止使用Wait()、.Result这类同步阻塞方法处理异步Task。

额外排查方向

如果修改上述代码后问题仍存在,可按以下方向排查:

  • 升级Xamarin Forms版本:部分旧版本Xamarin Forms存在Android 10系统的弹窗兼容性bug,可升级到4.8及以上的稳定版本复测
  • 检查应用权限:EMUI 10对应用弹窗权限做了更严格的限制,确认应用的「悬浮窗」「弹窗通知」权限是否被系统禁止,无权限的情况下弹窗会被系统直接拦截
  • 检查弹窗触发时机:如果弹窗是在页面初始化阶段(如OnAppearing方法未执行完成、页面还未挂载到窗口)触发,会导致弹窗找不到宿主无法弹出,可延迟到页面完全加载完成后再触发弹窗复测

内容的提问来源于stack exchange,提问作者Nane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 05:48:03