如何在反应原生的特定时间安排后台工作

时间:2017-08-22 19:31:14

标签: android ios react-native react-native-android react-native-ios

我想在一天中的特定时间在反应原生的背景中执行一些任务T.我发现在Android中使用Headless JS是可能的。我发现这个库实现了这个https://github.com/vikeri/react-native-background-job并允许你在后台执行东西。

这不完全是我所期待的,它不允许您在特定时间安排任务T.有谁知道这方面的任何工作?

我已查看此帖Execute code at specific time in react native,但我找不到解决问题的方法。

3 个答案:

答案 0 :(得分:13)

我遇到了类似的问题,不幸的是,你不能在RN中指定类似于CRON行为的东西。

我对该问题的解决方案是使用此库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);
}

请注意,此解决方案容易受到用户更改手机时间的影响。完美的解决方案是使用一些外部服务来获取时间。

第二个注意事项,应用程序至少需要在后台才能实现。

答案 1 :(得分:1)

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)都适用。

答案 2 :(得分:0)

创建课程并在课堂中添加

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
                }
            });
        }
    }