如何在React Native中实现执行时间长的代码?

Chenhua

我正在用React Native和Expo构建一个新的应用程序。这个程序的主要功能是为用户生成计划。生成算法大约需要300-500秒才能执行。(它包含最多2,100,000次随机生成。)

目前,我面临两个问题:

Q1。在测试期间,这段代码直接放在App.js-App类-render函数中。但是,如果执行时间超过32秒,则该应用将无法呈现,并且永远保持无响应。

所以问题是:

1.1最长32秒的原因是什么,否则无响应?

1.2有更好的测试方法吗?

当前测试方法:

export default class App extends React.Component {
  componentDidMount() {
    if (__DEV__) {
      Reactotron.connect();
      Reactotron.log('hello rendering world');
    }
  }

  render() {
    //test
    generatePlan(store.getState(), 0);

    return (
      <Provider store={store}>
        <AppContainer />
      </Provider>
    );
  }
}

Q2。最后,单击“生成”按钮后,用户无法长时间呆呆。因此,理想情况下,此长时间执行的任务应在资源有限(包括内存和计算)的后台运行,以便用户可以在等待期间执行其他操作而不会受到太大影响(例如病毒扫描任务,一旦完成,就会弹出)留言等)

所以这里的问题是:

如何实现呢?

我试过的

对于第一季度:目前我不知道原因,甚至无法弄清楚要搜索的准确关键词。(我尝试在Google中搜索“反应本机执行时间长”,“无响应”等,以响应本机github问题,世博论坛,但没有运气。)

目前,我进行测试的想法是分别执行每个部分并手动存储每个部分的结果。然后使用每个部分的存储结果进行最后的部分。

对于第二季度:有一个库“ react-native-background-task”:

“该库允许调度单个定期任务,该任务在应用程序处于后台或关闭状态时执行,执行频率不超过每15分钟一次。可以使用网络,AsyncStorage等(除UI外的任何方式),因此非常适合诸如后台数据同步以提供离线支持。”

但是有关此潜在解决方案有两个问题:

一种。打开应用程序后如何在后台运行任务?

b。如何限制此任务使用的计算资源?(因为任务可以缓慢执行,但是如果用户仍在使用手机,则不应占用过多的计算资源。)

海森秘书

好吧,我不认为您的问题有一个明确的答案,但这是我的想法:

  • 我不确定任何32秒的渲染限制,但是将UI阻塞1秒是不切实际的,并且对用户体验不利。
  • render()方法内部执行任何操作都不是一个好习惯每当更新状态或重新渲染组件时,都会频繁调用此方法。因此,它应该尽可能轻巧,并且只应包含返回的组件。此外,为了避免任何意外行为,该render()方法应为纯方法
  • 在这种情况下,我要做的是用C ++重写计算算法,然后在React Native和Android / iOS之间建立一座桥梁,在那里我可以在UI线程旁边的线程上运行代码,然后将值返回给Java脚本的JavaScript部分。应用程式。
    • 在繁重的计算中使用C ++可以提高性能,并且可以帮助您将算法保持在一个位置(以便于维护和调试)。
    • 您还可以使用Java / Kotlin(适用于Android)和Objective-C(适用于iOS)编写该算法两次,这种方法对于避免任何C ++代码复杂性很有用,但是再次用相同的语言编写相同的代码两次(因此您将面对其他并发症)。
    • 查阅本文以了解有关本机模块/桥的更多信息。
    • 另外,请查看本文以获取有关Android C ++的信息。
  • 解决此问题的另一种方法是将算法移动到集中式服务器,在该服务器中计算值并将其存储在服务器上,然后使用某种Web API对其进行检索。
  • 现在,如果您(出于某种原因)希望将算法保留在JavaScript中,则必须将计算过程分解为细小且轻巧的部分requestAnimationFrame,例如,对于每个部分,例如,如果您的算法生成一个随机数,然后对其进行一些计算并重复此过程200万次,您将需要requestAnimationFrame进行每次计算,将当前结果存储在某个地方,并请求另一帧进行下一次计算。
    • 我们之所以这样做,是因为根据合同,JavaScript只有一个线程,并且所有JS代码(包括屏幕上的渲染框架)都在该线程上发生,因此我们将代码分成小段,以允许在它们之间呈现新的帧。
    • 查看本文,以了解有关划分工作负载和动画帧的更多信息。

祝好运

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章