【问题标题】:How to schedule background job at specific time in react nativereact-native - 如何在特定时间安排后台作业
【发布时间】:2018-01-31 05:01:31
【问题描述】:

我想在一天中的特定时间在后台执行一些任务 T,以响应本机。我看到现在可以在android中使用Headless JS。我发现这个库实现了这个https://github.com/vikeri/react-native-background-job 并允许你在后台执行东西。

这并不完全是我想要的,它不允许您在特定时间安排任务 T。有谁知道解决这个问题?

我已经检查了这个线程 Execute code at specific time in react native,我没有找到我的问题的解决方案。

【问题讨论】:

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


    【解决方案1】:

    我遇到了类似的问题,很遗憾,您无法在 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);
    }
    

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

    第二点,应用程序至少需要在后台才能运行。

    【讨论】:

    • 可能为时已晚,但这仍然是最好的方法吗?
    • 该库似乎在 android 中使用了唤醒锁,并且在应用程序处于后台时未释放。这可能会耗尽电池电量。这仍然是最好的解决方案吗?
    • 这仅用于在 appstate 为后台运行任务 |积极的。未处于关闭状态
    【解决方案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
                      }
                  });
              }
          }
      

      【讨论】:

      • 将此代码放在您要在后台运行的服务类中
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2013-09-08
      • 2019-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-18
      相关资源
      最近更新 更多