React Native后台计时器永不停止

时间:2019-02-22 18:31:56

标签: javascript react-native timer

我正在构建一个具有计时器的应用程序,该计时器在计时器处于活动状态时请求地理定位。对于计时器,我正在使用react-native-background-timer。这是一种工作方式,但并非完全符合我的要求。

使用这段代码:

BackgroundTimer.runBackgroundTimer(() => { 
    console.log('tic');
},  
1000);

当应用程序在后台运行时,计时器停止运行。在这段代码中:

const intervalId = BackgroundTimer.setInterval(() => {
    console.log('tic');
}, 1000);

即使在后台它也会持续运行,但是我无法停止它。当我运行BackgroundTimer.clearInterval(intervalId);时,计时器仍在运行。即使当我离开屏幕并返回主屏幕时,计时器仍会滴答滴答,并且永远不会停止。这不是理想的,因为我需要计时器运行几分钟然后停止。

我将计时器设置为1秒以更新屏幕上剩余的时间。我本来打算将计时器设置为6分钟一次,但是如何每秒钟更新一次状态?为此,为它设置2个计时器感觉很不好。

因此,为了使其更加清楚,用户假设要进行某些活动,例如步行几分钟。因此,当用户接听电话或打开音乐应用程序以切换音乐或其他功能时,我不能让计时器停止计时。计时器仍然需要运行,我需要通过地理位置来测量步数和距离。即使用户打开了另一个应用程序,却忘记了我的应用程序,它仍然可以正常工作,并且在剩余时间内仍可以运行,然后在数据库中记录并停止。

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 上一切正常。