Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BackgroundTimer.clearTimeout does not stop ongoing background task #523

Open
rakshitbharat opened this issue Dec 5, 2023 · 0 comments
Open

Comments

@rakshitbharat
Copy link

rakshitbharat commented Dec 5, 2023

cant stop the running task

import BackgroundTimer from 'react-native-background-timer';
import {DeviceEventEmitter} from 'react-native';

/**
 * Class BackgroundTaskManager is designed to manage background tasks using
 * react-native-background-timer. However, the task started by scheduleTask
 * does not stop when finish is called.
 */
class BackgroundTaskManager {
  static instance = null;
  static iteration = 0;
  static backgroundTaskId = null;

  constructor() {
    if (!BackgroundTaskManager.instance) {
      BackgroundTaskManager.instance = this;
      BackgroundTaskManager.resetInit();
      console.log('BackgroundTaskManager initialized');
    }

    return BackgroundTaskManager.instance;
  }

  /**
   * Resets the task manager and clears any existing background task.
   */
  static resetInit() {
    this.configArgsiOS = null;
    this.configStartFunction = null;
    this.configTimeoutFunction = null;
    this.task = null;
    this.options = null;
    this.iteration++;
    if (this.backgroundTaskId !== null) {
      BackgroundTimer.clearTimeout(this.backgroundTaskId);
      this.backgroundTaskId = null;
    }
    console.log('BackgroundTaskManager reset');
  }

  /**
   * Configures the task manager with provided arguments.
   */
  static async configure(...args) {
    BackgroundTaskManager.resetInit();
    console.log('Configuring with args:', args);
    if (args.length > 1) {
      this.configStartFunction = args[1];
    }
    if (args.length > 2) {
      this.configTimeoutFunction = args[2];
    }
    console.log('Configuration is now unified for both platforms.');
  }

  /**
   * Schedules a new background task to start after a specified delay.
   */
  static async scheduleTask(...args) {
    const { taskId } = args[0];
    console.log('Scheduling task with args:', args);

    this.backgroundTaskId = BackgroundTimer.setTimeout(async () => {
      if (this.configStartFunction) {
        // Example long-running task
        let count = 0;
        while (true) {
          console.log(count++);
          await BackgroundTaskManager.delay(1000);
        }
      }
    }, 1000); // 1 second delay

    console.log(`Background task ${taskId} scheduled`);
  }

  /**
   * Attempts to stop the background task. However, this does not
   * seem to stop the ongoing task.
   */
  static async finish() {
    console.log(`Stopping background task`, {
      bg: BackgroundTaskManager.backgroundTaskId,
    });
    BackgroundTimer.clearTimeout(BackgroundTaskManager.backgroundTaskId);
    console.log(`Background task stopped`);
  }

  static delay = ms => new Promise(resolve => setTimeout(resolve, ms));
}

export default BackgroundTaskManager;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant