现象描述
在某些异步回调中,Toast 和 Dialog 不能显示,如:
commentManager.showCommentDialog(this.getUIContext().getHostContext() as common.UIAbilityContext).then(()=>{
// something
}).catch((err: BusinessError<Object>) => {
myShowToast();
myShowDialog();
});
myShowToast 和 myShowDialog 是一些非常正常的显示逻辑,但是却发现无法正常显示。
解决方法
- 对于 Toast,可以设置 showMode 为 TOP_MOST
this.getUIContext().getPromptAction().showToast({
message: "message",
duration: 1500,
showMode: promptAction.ToastShowMode.TOP_MOST
});
- 对于 Toast 和 Dialog,可以延时调用
commentManager.showCommentDialog(this.getUIContext().getHostContext() as common.UIAbilityContext).then(()=>{
// something
}).catch((err: BusinessError<Object>) => {
setTimeout(() => {
myShowToast();
myShowDialog();
}, 500);
});
个人测试发现,当延时调用后就可以正常显示 Toast 和 Dialog 了。
当 delay 为 100 时,本地模拟器测试可以正常显示;当 delay 为 10 时,本地模拟器测试有概率显示;当 delay 为 1 时,本地模拟器测试无法正常显示。
为尽量在无感前提下保证成功率,建议考虑将 delay 设置为 300 以上。
异常原因
由以上解决方法,可以猜测这与线程或是上下文无关,而是对于特定的操作(实测 startAbility 的回调也会出现这种情况,个人猜测是打开页面或者调用界面一类的),在执行时能会阻止 Toast 和 Dialog 的显示(可能是将应用判成处于后台从而不能显示),因此延时调用,等待操作完全结束后就可以正常显示了。
附录
参考文献
版权信息
本文原载于 reincarnatey.net 与华为开发者联盟,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。