Ich möchte einige Task T zu einem bestimmten Zeitpunkt an einem Tag im Hintergrund in React native ausführen. Ich sehe, dass es in Android ab sofort möglich ist, Headless JS zu verwenden. Ich habe herausgefunden, dass diese Bibliothek diese https://github.com/vikeri/react-native-background-job implementiert hat und Ihnen erlaubt, im Hintergrund Dinge auszuführen.
Dies ist nicht ganz das, was ich suche, es erlaubt Ihnen nicht, eine Aufgabe T zu einer bestimmten Zeit einzuplanen. Kennt jemand eine Umgehung dafür?
Ich habe diesen Thread überprüft Code zu einer bestimmten Zeit in React native ausführen / wo ich keine Lösung für mein Problem gefunden habe.
Ich bin auf ein ähnliches Problem gestoßen, leider können Sie in RN nichts ähnliches wie die CRON-Aktion angeben.
Meine Lösung für dieses Problem besteht darin, diese Bibliothek https://github.com/ocetnik/react-native-background-timer zu verwenden und die Differenz zwischen der aktuellen Uhrzeit und der geplanten Zeit der Aufgabe zu berechnen.
Die berechnete Zeit sollte in ms angegeben werden, damit Sie sie mit der bereitgestellten Funktion setTimeout
verwenden können:
// 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);
Beispiel:
Angenommen, Sie möchten die Aufgabe für morgen auf den 16. planen, in componentDidMount
können Sie die Zeit zwischen dem aktuellen Datum und dem geplanten Datum berechnen. Verwenden wir moment
dafür:
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);
}
Beachten Sie, dass diese Lösung anfällig für einen Benutzer ist, der die Uhrzeit auf seinem Telefon ändert. Die perfekte Lösung wäre, einen externen Dienst zum Abrufen der Zeit zu verwenden.
Zweitens muss die App mindestens im Hintergrund sein, damit dies funktioniert.
JavaScript-Code wird im Vordergrund mit nur einem Thread ausgeführt. Wenn Sie eine geplante Hintergrundaufgabe benötigen, müssen Sie native Module implementieren, wie im RN-Dokument beschrieben:
https://facebook.github.io/react-native/docs/native-modules-ios.html
https://facebook.github.io/react-native/docs/native-modules-Android.html
Selbstverständlich gelten alle Plattformeinschränkungen (insbesondere iOS).
Erstellen Sie eine Klasse und fügen Sie diese in Ihre Klasse ein
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
}
});
}
}