web-dev-qa-db-fra.com

Planifiez un travail en arrière plan à une heure précise dans le natif de réaction

Je veux exécuter une tâche T à une heure précise de la journée en arrière-plan en natif. Je vois qu'il est possible sous Android à partir de maintenant d'utiliser Headless JS . J'ai trouvé que cette bibliothèque implémentait ce https://github.com/vikeri/react-native-background-job et vous permet d'exécuter des choses en arrière-plan.

Ce n’est pas tout à fait ce que je cherche, cela ne vous permet pas de planifier une tâche T à une heure précise. Est-ce que quelqu'un connaît des travaux pour cela? 

J'ai vérifié ce fil Exécuter le code à une heure spécifique dans réagit natif où je n'ai pas trouvé de solution à mon problème.

19
N Sharma

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 consiste à utiliser cette bibliothèque https://github.com/ocetnik/react-native-background-timer et à calculer la différence entre l'heure actuelle et l'heure de planification de la tâche.

Le temps calculé doit être en ms, vous pouvez donc l'utiliser avec la 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: 

Supposons que vous souhaitiez planifier la tâche pour demain à 16, dans componentDidMount, vous pouvez 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 qui change l'heure sur son téléphone. La solution idéale serait d'utiliser un service externe pour récupérer le temps.

Deuxième remarque, l'application doit être au moins à l'arrière-plan pour que cela fonctionne.

13
jmac

Le code JavaScript s'exécute en avant-plan avec un seul thread. Si vous avez besoin d'une tâche en arrière-plan planifiée, vous devez implémenter des modules natifs, comme décrit dans le document RN:

https://facebook.github.io/react-native/docs/native-modules-ios.html

https://facebook.github.io/react-native/docs/native-modules-Android.html

Bien entendu, toutes les restrictions de la plate-forme (notamment iOS) s'appliquent. 

1
Alt Eisen

Créer une classe et l'ajouter à 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
vijay chaudhary