15

Je souhaite exécuter une tâche T à un moment précis d'une journée en arrière-plan dans Réactualiser. Je vois que c'est possible dans Android dès maintenant en utilisant Headless JS. J'ai trouvé que cette bibliothèque implémentée https://github.com/vikeri/react-native-background-job et vous permet d'exécuter des choses en arrière-plan.Comment planifier le travail d'arrière-plan à un moment précis dans réagit natif

Ce n'est pas complètement ce que je cherche, il ne vous permet pas de planifier une tâche T à un moment précis. Est-ce que quelqu'un sait n'importe quel travail autour de cela?

J'ai vérifié ce fil Execute code at specific time in react native où je n'ai pas trouvé de solution à mon problème.

Répondre

5

Je suis tombé sur un problème similaire, malheureusement, vous ne pouvez pas spécifier quelque chose de similaire à l'action CRON dans RN.

Ma solution à ce problème est d'utiliser cette bibliothèque https://github.com/ocetnik/react-native-background-timer et de calculer la différence entre l'heure actuelle et l'heure à laquelle la tâche est prévue.

Le temps calculé doit être en ms, de sorte que vous pouvez l'utiliser avec fonction fournie setTimeout:

// Start a timer that runs once after X milliseconds 
const timeoutId = BackgroundTimer.setTimeout(() => { 
    // this will be executed once after 10 seconds 
    // even when app is the the background 
    console.log('tac'); 
}, 10000); 

Exemple:

Disons que vous voulez tâche de planifier pour demain à 16, en componentDidMount vous peut calculer le temps entre maintenant et la date prévue. Utilisons moment pour cela:

componentDidMount(){ 
    const scheduledDate = 
    moment().add(1,'d').set({hour:16,minute:0,second:0,millisecond:0}) 
    const diffTime = scheduledDate.diff(moment()) 
    this.timeoutId = BackgroundTimer.setTimeout(() => { 
    console.log('tac'); 
    }, diffTime); 
} 

componentWillUnmount(){ 
BackgroundTimer.clearTimeout(this.timeoutId); 
} 

Notez que cette solution est vulnérable à un utilisateur de changer l'heure sur son téléphone. La solution idéale serait d'utiliser un service externe pour gagner du temps. Deuxièmement, l'application doit être au moins en arrière-plan pour que cela fonctionne.

0

Créer une classe et ajoutez dans votre classe

public static final long NOTIFY_INTERVAL = 10 * 1000; // 30 minutes 

@Override 
    public void onCreate() { 
     // cancel if already existed 
     if (mTimer != null) { 
      mTimer.cancel(); 
     } else { 
      // recreate new 
      mTimer = new Timer(); 
     } 
     // schedule task 
     mTimer.scheduleAtFixedRate(new TimeDisplayTimerTask(), 0, NOTIFY_INTERVAL); 
    } 

class TimeDisplayTimerTask extends TimerTask { 
     @Override 
     public void run() { 
      // run on another thread 
      mHandler.post(new Runnable() { 
       @Override 
       public void run() { 
        // code 
       } 
      }); 
     } 
    } 
+0

Placez ce code dans votre classe de service que vous souhaitez exécuter en arrière-plan –