【问题标题】:Timeout in a react-native headless js taskreact-native 无头 js 任务中的超时
【发布时间】:2017-08-13 14:57:21
【问题描述】:

我正在开发一个带有无头 js 任务的 react-native 应用程序来完成一些后台工作。

我需要在一段时间后执行一些代码,但注意到使用 setTimeout 执行会暂停,直到应用再次处于前台。

有人知道为什么会发生这种情况并知道如何解决或解决这个问题吗?

编辑

一个简单的例子

module.exports = async (taskData) => {

    for (let i = 0; i < 30; i++) {
        setTimeout(function(){
            console.log(i);            
        }, 1000*i + 100);
    }

    return;
}

当我启动应用程序日志开始正确打印在控制台中,但是当我将应用程序放在后台日志停止。 一旦应用再次处于前台,所有剩余的日志都会一起打印在控制台中。

【问题讨论】:

  • 你解决了吗?
  • @ThiagoNascimento 我发现的唯一“解决方案”是在 java 中实现本机模块

标签: javascript android react-native


【解决方案1】:

我遇到了同样的问题并开始调试它。问题在于当您的应用程序在后台时如何构造 ReactContext。在 TimingModule 初始化之前创建的上下文信号,并且您的任务会立即由 HeadlessJsTaskService 执行(在 TimingModule 初始化之前)。

但是,TimingModuleHeadlessJsTaskContext 添加了一个侦听器,以便仅在有活动的后台任务时运行。此侦听器附加在 TimingModule.initialize() 中 - 但由于执行顺序,此侦听器是在您的任务已经启动之后附加的,这意味着它永远不会被调用,因此 TimingModule 没有运行。

这可以通过将HeadlessJsTaskContext.addTaskEventListener(...) 声明为synchronized 然后为每个当前活动的任务调用添加的侦听器来解决。 之前:

  public void addTaskEventListener(HeadlessJsTaskEventListener listener) {
    mHeadlessJsTaskEventListeners.add(listener);
  }

之后:

  public synchronized void addTaskEventListener(HeadlessJsTaskEventListener listener) {
    mHeadlessJsTaskEventListeners.add(listener);
    for (Integer activeTaskId: mActiveTasks) {
      listener.onHeadlessJsTaskStart(activeTaskId);
    }
  }

您是否为此创建了 GitHub 问题?我想向 PR 提供修复并链接它。

如果有兴趣,我可以分享react-native 的补丁版本。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
  • 2019-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
相关资源
最近更新 更多