应用周期中的onLaunch和onShow中的setTimeout可能会不执行

应用周期中的onLaunch和onShow中的setTimeout可能会不执行

开发环境 版本号 项目创建方式
Windows win10 HBuilderX
产品分类:uniapp/App

PC开发环境操作系统:Windows

HBuilderX类型:正式

HBuilderX版本号:4.56

手机系统:Android

手机系统版本号:Android 13

手机厂商:小米

手机机型:不限

页面类型:vue

vue版本:vue2

打包方式:云端

项目创建方式:HBuilderX

### 示例代码:

```javascript
onShow: function() {
console.log('App Show')
//#ifdef APP  
    // 关闭启动图  
    timer = setTimeout(() => {  
        plus.navigator.hasSplashscreen() && plus.navigator.closeSplashscreen()  
    }, 1000)  
    //#endif  
},

操作步骤:

在onLaunch和onShow中的setTimeout中执行plus.navigator.hasSplashscreen() && plus.navigator.closeSplashscreen()

预期结果:

关闭启动图

实际结果:

setTimeout 到时间未执行

bug描述:

把app快速的关闭再打开,应用周期中的onLaunch和onShow中的setTimeout可能会不执行


2 回复

我也碰到了,是onLaunch整个都不执行,所有生命周期就突然无效了,重启几次都不管用那种


这是一个典型的应用生命周期管理问题。在uni-app中,当应用被快速关闭再打开时,可能会出现以下情况:

  1. 应用被强制终止后重新启动,导致前一个实例的定时器被清除
  2. 应用进入后台后,系统可能会限制JS线程的执行

解决方案建议:

  1. 使用更可靠的方式关闭启动图,可以尝试直接调用不加延迟:
onShow() {
    //#ifdef APP
    plus.navigator.hasSplashscreen() && plus.navigator.closeSplashscreen()
    //#endif
}
  1. 如果需要延迟,建议使用uni-app提供的定时器API:
onShow() {
    //#ifdef APP
    this.$nextTick(() => {
        plus.navigator.hasSplashscreen() && plus.navigator.closeSplashscreen()
    })
    //#endif
}
回到顶部