当应用程序被杀死然后在React Native Expo中重新启动时,setInterval会变得更快

问题描述 投票:0回答:1

我正在 React Native Expo 中构建一个秒表,它能够在后台运行,或者当使用

asyncstorage
杀死应用程序时运行。当我启动秒表时,我会终止该应用程序,然后在 expo go 中重新启动它,或者在我的真实设备上安装该应用程序后,秒表变得比应有的速度更快。我在谷歌上搜索了解决方案,他们建议在卸载应用程序时清除间隔,但是当我有一个启动间隔的开始和停止按钮时我该怎么做。下面是与本节相关的代码。 (如果还有什么需要分享的请告诉我)

注意:当我终止应用程序然后重新启动它时,我看到计时器走得更快。如果我单击“停止”,然后单击“开始”,计时器将正常工作,但速度不会很快,所以这是

clearInterval
的问题,但在哪里使用是问题。

const [isRunning, setIsRunning] = useState(false);
const [time, setTime] = useState(0);


const intervalRef = useRef(null);

const handleStartButtonPress = async () => {
    setIsRunning(!isRunning);
};

useEffect(() => {
    console.log("started: ", started);
    
    if (isRunning) {
        intervalRef.current = setInterval(() => {
            setTime(previousTime => previousTime + 100);
        }, 100);
    } else {
        clearInterval(intervalRef.current);
    }

    return () => clearInterval(intervalRef.current);
    
}, [isRunning]);
javascript react-native expo setinterval
1个回答
0
投票

我不确定这是否相关,但在 Android React Native 上,当您的应用程序由于某些系统配置更改而自动重新启动时,间隔和超时(以及事件侦听器和类静态)仍然存在,例如改变语言。我在任何地方都找不到这种行为的记录,但我已经测试过它(在 RN 0.66 上)并且它肯定会发生。这可能与您的问题有关吗?

根据 Android 的 activity 生命周期,MainActivity 似乎正在执行

onRestart
,并且 React Native 在重新启动应用程序的 JavaScript 端之前不会进行清理。

© www.soinside.com 2019 - 2024. All rights reserved.