HarmonyOS 鸿蒙Next中应用启动后第一次调用setTimeout/setInterval没有回调事件

HarmonyOS 鸿蒙Next中应用启动后第一次调用setTimeout/setInterval没有回调事件

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    let appCtx = this.context.getApplicationContext();
    MMKV.initialize(appCtx);
    this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET);
  }

  onWindowStageCreate(windowStage: window.WindowStage): void {
    // Main window is created, set main page for this ability
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');

    setTimeout(() => {
      console.log('EntryAbility-onWindowStageCreate');
    }, 2000);

    windowStage.loadContent('pages/SplashPage', (err) => {
      if (err.code) {
        hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
        return;
      }
      hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.');
    });
  }
}

比如我这个代码 在onWindowStageCreate调用setTimeout就不会打印log

是我哪里写的不对吗?谁有办法?


更多关于HarmonyOS 鸿蒙Next中应用启动后第一次调用setTimeout/setInterval没有回调事件的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

鸿蒙Next中应用首次调用setTimeout/setInterval无回调,主要涉及应用生命周期与异步任务调度机制。在应用启动初期,系统任务队列可能尚未完成初始化,导致首次设置的定时器未被正常注册。该问题与ArkTS引擎的初始化时序相关,当应用组件完成创建但事件循环未完全就绪时,会触发此现象。可通过在应用启动阶段添加微任务延迟或使用Promise.then()确保定时器注册时机。部分场景下需检查应用Ability的onWindowStageCreate回调完成状态。

更多关于HarmonyOS 鸿蒙Next中应用启动后第一次调用setTimeout/setInterval没有回调事件的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在 HarmonyOS Next 中,应用启动时 onWindowStageCreate 阶段的事件循环可能尚未完全初始化,导致首次调用 setTimeoutsetInterval 的回调无法触发。这属于系统初始化时序问题,并非代码逻辑错误。

解决方案
setTimeout 延迟到页面加载完成后执行,例如在 loadContent 的回调中调用:

windowStage.loadContent('pages/SplashPage', (err) => {
  if (err.code) {
    hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
    return;
  }
  hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.');
  
  // 在页面加载完成后调用 setTimeout
  setTimeout(() => {
    console.log('EntryAbility-onWindowStageCreate');
  }, 2000);
});

此调整可确保事件循环已就绪,从而正常触发定时器回调。

回到顶部