返回

踩坑记录 | ArtTS 异步回调中 Toast 和 Dialog 不显示的解决方法与可能原因

现象描述

在某些异步回调中,Toast 和 Dialog 不能显示,如:

commentManager.showCommentDialog(this.getUIContext().getHostContext() as common.UIAbilityContext).then(()=>{
  // something
}).catch((err: BusinessError<Object>) => {
  myShowToast();
  myShowDialog();
});

myShowToast 和 myShowDialog 是一些非常正常的显示逻辑,但是却发现无法正常显示。

解决方法

  1. 对于 Toast,可以设置 showMode 为 TOP_MOST
this.getUIContext().getPromptAction().showToast({
  message: "message",
  duration: 1500,
  showMode: promptAction.ToastShowMode.TOP_MOST
});
  1. 对于 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 协议,复制请保留原文出处。

本博客所有内容无特殊标注均为失迹原创内容,复制请保留原文出处。


© Licensed Under CC BY-NC-SA 4.0