跳到主要内容

UI上下文异常调试

本指导主要介绍如何解决因使用无效的UIContext导致文本显示异常的问题。当开发者使用了已失效的UIContext对象(通常是因为对应的UI实例已被销毁),可能导致后续UI操作无效。此类问题常见于多窗口场景。从API version 12开始,该问题也见于调用setSupportedProcessCache打开进程缓存后快速启动的情形。

定位UIContext错误问题

出现以下异常或系统日志时,可能存在UIContext无效的问题:

  • 存在JS异常:"Node Constructor error, param uiContext error"。

    产生该异常的原因通常是在自定义节点中使用了无效的UIContext,这可能导致后续UI操作被错误关联到该无效UIContext。

  • 存在实例状态更新时,上下文实例ID大于等于100000且小于1000000的日志:

    实例状态更新的日志格式为:

    ({currentId}:{trackedId}:{trackedReason})][{bundleName}][{moduleName}][{thisInstanceId}]: window {status}

    各字段含义为:

    字段名类型典型值说明
    {currentId}整数-1上下文实例ID,应用正常的情况下,该字段应该为负数。
    {trackedId}整数100000当前可间接跟踪的实例ID,通常为正数,开发者可忽略。
    {trackedReason}字符串singleton间接跟踪的原因,开发者可不关注该字段。
    {bundleName}字符串com.example.helloworld应用的bundleName。
    {moduleName}字符串entry当前模块的moduleName。
    {thisInstanceId}正数100000被通知UI实例的ID。
    {status}实例被通知的状态focus可选值为: - focus:获焦 - unfocus:失焦 - foreground:前台 - background:后台 - destroy:销毁

    可使用如下正则表达式匹配相关日志:

    (-?\d+:-?\d+:(scope|active|default|singleton|foreground|undefined))] [[a-z0-9.]+][[a-zA-Z][0-9a-zA-Z_.]*][\d+]: window (focus|unfocus|foreground|background|destroy)

    示例说明

    • 正确日志示例:

      (-2:100000:singleton)] [com.example.helloworld][entry][100000]: window foreground

    • 异常日志示例:

      (100000:100000:scoped)] [com.example.helloworld][entry][100001]: window background

      该异常日志说明存在错误跟踪ID为100000的UI实例。

    • 若前文出现以下特定格式的日志:

      (-2:100000:singleton)] [com.example.helloworld][entry][100000]: window destroy

      表示ID为100000的UI实例已销毁,后续UI操作可能受其上下文影响。

解决UIContext错误导致的显示异常问题

问题现象

当发生以下问题时,可根据上文的关键日志或异常进行判断:

  1. 使用setStyledString方法设置字体大小时,字体大小未发生预期变化。
  2. 使用UIContext成员方法时,界面没有响应或显示异常。

解决措施

重新获取有效的UIContext对象。可通过以下方式获取: