我正在构建一个具有计时器的应用程序,该计时器在计时器处于活动状态时请求地理定位。对于计时器,我正在使用react-native-background-timer。这是一种工作方式,但并非完全符合我的要求。
使用这段代码:
BackgroundTimer.runBackgroundTimer(() => {
console.log('tic');
},
1000);
当应用程序在后台运行时,计时器停止运行。在这段代码中:
const intervalId = BackgroundTimer.setInterval(() => {
console.log('tic');
}, 1000);
即使在后台它也会持续运行,但是我无法停止它。当我运行BackgroundTimer.clearInterval(intervalId);
时,计时器仍在运行。即使当我离开屏幕并返回主屏幕时,计时器仍会滴答滴答,并且永远不会停止。这不是理想的,因为我需要计时器运行几分钟然后停止。
我将计时器设置为1秒以更新屏幕上剩余的时间。我本来打算将计时器设置为6分钟一次,但是如何每秒钟更新一次状态?为此,为它设置2个计时器感觉很不好。
因此,为了使其更加清楚,用户假设要进行某些活动,例如步行几分钟。因此,当用户接听电话或打开音乐应用程序以切换音乐或其他功能时,我不能让计时器停止计时。计时器仍然需要运行,我需要通过地理位置来测量步数和距离。即使用户打开了另一个应用程序,却忘记了我的应用程序,它仍然可以正常工作,并且在剩余时间内仍可以运行,然后在数据库中记录并停止。
答案 0 :(得分:2)
尝试以下代码段, 在android和ios上均可使用
import { DeviceEventEmitter, NativeAppEventEmitter, Platform } from 'react-native';
import _BackgroundTimer from 'react-native-background-timer';
const EventEmitter = Platform.select({
ios: () => NativeAppEventEmitter,
android: () => DeviceEventEmitter,
})();
class BackgroundTimer {
static setInterval(callback, delay) {
_BackgroundTimer.start();
this.backgroundListener = EventEmitter.addListener("backgroundTimer", () => {
this.backgroundTimer = _BackgroundTimer.setInterval(callback, delay);
});
return this.backgroundListener;
}
static clearInterval(timer) {
if (timer) timer.remove();
if (this.backgroundTimer)
_BackgroundTimer.clearInterval(this.backgroundTimer);
_BackgroundTimer.stop();
}
}
export default BackgroundTimer;
用法
const timer = BackgroundTimer.setInterval(callback, 1000);
BackgroundTimer.clearInterval(timer)
答案 1 :(得分:0)
出于某种原因,我在使用@Aravind Vemula 的回答时遇到以下错误。
调用 BackgroundTimer.clearInterval(timer);
时出现以下错误:
timer.remove 不是函数
这就是为什么我稍微修改了代码。
// parameter removed
static clearInterval() {
// ADD this if statement
if (this.backgroundListener){
this.backgroundListener.remove();
}
if (this.backgroundTimer)
_BackgroundTimer.clearInterval(this.backgroundTimer);
_BackgroundTimer.stop();
}
以上代码检查是否注册了后台侦听器。如果是,它会删除所有侦听器,尤其是我们的 backgroundTimer。
用法:
BackgroundTimer.clearInterval(); // removed parameter
我的更改后,在 iOS 14.3 上一切正常。