Как запланировать фоновое задание в определенное время в
Я хочу выполнить некоторую задачу T в определенное время за один день в фоновом режиме в ответ на native. Я вижу, что в андроиде теперь можно использовать Headless JS. Я обнаружил, что эта библиотека реализовала этот https://github.com/vikeri/react-native-background-job и позволяет выполнять материал в фоновом режиме.
Это не совсем то, что я ищу, это не позволяет запланировать задачу T в определенное время. Кто-нибудь знает какую-нибудь работу для этого?
Я проверил этот поток Выполняю код в определенное время в ответном native, где я не нашел решение моей проблемы.
Ответы
Ответ 1
Я столкнулся с подобной проблемой, к сожалению, вы не можете указать что-то похожее на действие CRON в RN.
Мое решение этой проблемы - использовать эту библиотеку https://github.com/ocetnik/react-native-background-timer и рассчитать разницу между текущим временем и временем, на которое запланирована задача.
Вычисленное время должно быть в мс, поэтому вы можете использовать его с предоставленной функцией 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);
Пример:
Предположим, вы хотите запланировать задачу на завтра в 16-м, в componentDidMount
вы можете рассчитать время между текущей и запланированной датой. Для этого используйте moment
:
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);
}
Обратите внимание, что это решение уязвимо для пользователя, изменяющего время на своем телефоне. Идеальное решение - использовать некоторую внешнюю службу для получения времени.
Во-вторых, приложение должно быть по крайней мере в фоновом режиме для этого.
Ответ 2
JavaScript-код работает на переднем плане только с одним потоком. Если вам нужна запланированная фоновая задача, вам необходимо реализовать собственные модули, как описано в документе RN:
https://facebook.github.io/react-native/docs/native-modules-ios.html
https://facebook.github.io/react-native/docs/native-modules-android.html
Конечно, применяются все ограничения платформы (особенно iOS).
Ответ 3
Создайте класс и добавьте его в свой класс
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
}
});
}
}