Javascript 为什么在Android中旋转屏幕时无法取消设置间隔?

Javascript 为什么在Android中旋转屏幕时无法取消设置间隔?,javascript,android,timer,setinterval,screen-rotation,Javascript,Android,Timer,Setinterval,Screen Rotation,各位发展商: 我正在设计一个计时器,它应该能够在屏幕旋转时保持时间,但我注意到以下代码有一个非常奇怪的行为: function startTimer() { var setTime = setInterval(function () { console.log('increasing'); if (isPaused) clearInterval(setTime); else { counter

各位发展商:

我正在设计一个计时器,它应该能够在屏幕旋转时保持时间,但我注意到以下代码有一个非常奇怪的行为:

function startTimer() {
    var setTime = setInterval(function () {
        console.log('increasing');
        if (isPaused)
            clearInterval(setTime);
        else {
            counter++;
            setLocalStorage("counter", counter + 1);
        }
    }, 1000);
}

function setLocalStorage(key, val) {
    if (getLocalStorageValue(key) !== null)
        removeLocalStorage(key);
    localStorage.setItem(key, val);
}

function getLocalStorageValue(key) {
    return localStorage.getItem(key);
}

function removeLocalStorage(key) {
    localStorage.removeItem(key);
}
我发现在旋转屏幕后,计数器仍在不断增加,控制台中甚至没有打印console.log。我假设setInterval在某个地方继续并行运行,我找不到停止它的方法,因为我可以将
isPaused
的变量更改为
true
,但计数器仍然在运行,没有有效的原因,直到应用程序完全关闭为止。你们有没有经历过类似的事情

另外,从安卓系统的角度来看,我每次完全重新加载HTML页面时,它不应该保留任何内容,或者你知道每次完全重新加载浏览器的方法吗

另外,我在Android中添加了这段代码,但什么也没有发生:

@Override
protected void onDestroy() {
    super.onDestroy();
    WebView.pauseTimers();
}

感谢您的建议或支持。

经过一些研究,我发现了如何解决这个问题以及正在发生的事情

首先,如果您正在运行一个
setInterval
,并且在旋转屏幕时未在网络视图中清除它,则原始的
setInterval
将继续在后台的某个位置运行,如果您再次旋转它并再次运行计时器,它将创建另一个间隔,以此类推

如果您希望能够修复它,则需要在每次旋转屏幕时清理页面。我是怎么做到的

在继续之前,我的解决方案是用C#编写的,因为我正在Xamarin.Android中构建应用程序;但是,您可以在一眨眼之间将其转换为Java或Kotlin,它看起来是这样的:

  • 声明一个静态变量,用于检查应用程序是否第一次恢复:

    public static bool RUN_ONCE_RESUME { get; set; } = false;
    
    private void RunOnceResume()
    {
        if (!RUN_ONCE_RESUME)
        {
            RUN_ONCE_RESUME = true;
        }
    }
    
  • 按如下所示覆盖
    OnResume
    OnDestroy
    方法:

    如果不是第一次,则恢复时的
    必须重新启用计时器:

    protected override void OnResume()
    {
        base.OnResume();
    
        if (RUN_ONCE_RESUME)
        {
            WebView.ResumeTimers();
        }
        RunOnceResume();
    }
    
    ondestory
    必须杀死整个
    WebView
    ,如下所示:

    protected override void OnDestroy()
    {
        base.OnDestroy();
    
        WebView.RemoveAllViews();
        WebView.ClearHistory();
        WebView.ClearCache(true);
        WebView.LoadUrl("about:blank");
        WebView.OnPause();
        WebView.RemoveAllViews();
        WebView.PauseTimers();
        WebView.Destroy();
        WebView = null;
    }
    
  • 检查是否为第一次的方法:

    public static bool RUN_ONCE_RESUME { get; set; } = false;
    
    private void RunOnceResume()
    {
        if (!RUN_ONCE_RESUME)
        {
            RUN_ONCE_RESUME = true;
        }
    }
    
  • 我尝试了没有以前的方法,但在我的情况下它不起作用


    通过所有这些更改,计时器将按预期工作。

    似乎缺少代码的重要部分。。。。startTime是否被多次调用?setInterval也不准确…嗨@epascarello,不,只有在我单击“播放”时才调用多次。您上面的setInterval代码是错误的。。。。因此,我很难查看代码。@epascarello,我添加了缺少的部分。