我正在 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]);
我不确定这是否相关,但在 Android React Native 上,当您的应用程序由于某些系统配置更改而自动重新启动时,间隔和超时(以及事件侦听器和类静态)仍然存在,例如改变语言。我在任何地方都找不到这种行为的记录,但我已经测试过它(在 RN 0.66 上)并且它肯定会发生。这可能与您的问题有关吗?
根据 Android 的 activity 生命周期,MainActivity 似乎正在执行
onRestart
,并且 React Native 在重新启动应用程序的 JavaScript 端之前不会进行清理。