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
相关产品推荐
相关产品推荐

