移动端webview javascript timer切到后台后执行一段时间后自动停了

小时光
  • 472

问题描述

移动端webview切到后台后,timer五分钟自动停了

我们在做一个业务过程中,需要每隔一段时间去轮询业务里面的一个状态,只要状态没有到,就一直轮询下去,所以用了settimeout

以下补充一点做过的工作
注意:这里虽然是轮询,但是考虑到setInterval不能保证前面执行的回调已经执行完了,所以选择用了setTimeout,当然出现了这个问题之后我换了setInterval也一样,程序在轮询5分钟后,自动停了

补充点业务知识
我们这个是证券开户的双向视频-视频见证,就是视频连线,见证人(券商团队员工)、开户人两者之间的视频通话,由于这个过程要持续几分钟时间,直到见证人审核通过,在业务后台修改对应的状态,接口一直轮询到这个状态变更才会停止视频见证

用户一般是手机app,里面内嵌H5页面
见证人是pc

// 状态码 ,直到status=1,停止轮询
let status = 0
let timer = null;

function fun() {
    //请求接口,判断是否变化
    todo
    if(status ==1){
        clearInterval(timer)
        todo
    }
    if(status==0){
    // 10秒后改变状态码值
        clearInterval(timer)
        timer = setTimeout(() => {
            fun()
        }, 10000)
    }
}

问题出现的环境背景及自己尝试过哪些方法

目前只出现在华为Mate20手机中

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)

// 状态码 ,直到status=1,停止轮询
let status = 0

function fun() {
    //请求接口,判断是否变化
    if(status ==1){
        clearInterval(timer)
    }
    if(status==0){
    // 10秒后改变状态码值
        clearInterval(timer)
        let timer = setTimeout(() => {
            fun()
        }, 10000)
    }
}

你期待的结果是什么?实际看到的错误信息又是什么?

期待的结果就是,程序一直轮询下去,直到状态改变

补充一点测试细节:

假如延迟5秒执行,一般会在4分55秒停,就是说会在最后一次轮询到五分钟的时候,停止
如果延时6秒执行,一般会在4分54秒自动停

回复
阅读 4.4k
6 个回答

也许我上面问题描述的不够清晰,目前问题已初步得出结论。

这个问题是由于,当我们在webview进行双向视频的时候,

其实webview其实相当于进入了后台,华为手机系统默认webview进入后台5分钟后全部会被干掉,系统层面做的优化

,web端目前无法解决只能寄托于native层面。

用setInterval吧,setTimeout是延迟执行。

setInterval(() => {
    fun()
},5000)

fun(){
    //...
}

背景提供的太少了,是浏览器应用?还是 RN 还是别的啥?
既然不是任意复现,可以从别的角度去想了。

我想你这个是在移动端跑,然后应用放后台了吧。
应用在后台跑有时间限制的,一段时间之后会被杀掉。

0812更新:
https://developer.android.com...

settimeout延迟执行只执行一次。
setInterval按照指定的周期循环执行。
所以如果想一直轮询的话用setInterval

简简单单写了一个demo,大概和上面两位说的差不多。
1、setTimeout是延时执行,setInterval是周期性执行
2、根据楼主说的意思,我写了一个简单的demo,楼主可以运行一下看看是否是楼主需要的效果。

// 状态码
let status = 0
// 每2秒执行一次轮询
let timer = setInterval(() => {
    fun()
    console.log('轮询中')
}, 2000)

function fun() {
    if(status !=0) {
        clearInterval(timer)
        console.log('状态码改变,停止轮询')
    }
    // 10秒后改变状态码值
    setTimeout(() => {
        status = 1
    }, 10000)
}

你的问题我之前也试过(如果有还希望高手机赐教)
简单来说,你如果要作到一直背景执行用webview是行不通的
除了原生的app 外,是没办法达到你的目的的

目前我用android studio 来作,但目前结果不尽理想,还在嚐试其他的方式中

宣传栏