使用 React Native Navigation 注册大量屏幕时,Detox 卡在 JS Timer/Main Run Loop 上

Posted

技术标签:

【中文标题】使用 React Native Navigation 注册大量屏幕时,Detox 卡在 JS Timer/Main Run Loop 上【英文标题】:Detox gets stuck on JS Timer/Main Run Loop when registering a lot of screens with React Native Navigation 【发布时间】:2021-09-22 23:16:46 【问题描述】:

我有一个使用 React Native Navigation 的 React Native 应用程序,该应用程序在启动时使用 RNN 注册了很多屏幕(准确地说是 83 个屏幕)。当我尝试对应用程序运行 Detox E2E 测试时,Detox 报告系统正忙:

detox[1831] INFO:  [APP_STATUS] The system is busy with the following tasks:

Dispatch Queue
⏱ Queue: “Main Queue (<OS_dispatch_queue_main: com.apple.main-thread>)” with 1 work item

JS Timer
⏱ 3536

Run Loop
⏱ “Main Run Loop”

我发现防止这种情况发生的一件事是,当我注释掉大部分 RNN 屏幕注册调用时,只留下运行测试的基本屏幕。当我这样做时,排毒测试运行得很好。还有助于将所有 import 调用切换为注册到内联 requires 的 RNN 屏幕。但这会让我们失去对所有这些屏幕组件的类型检查。我试过使用Navigation.setLazyComponentRegistrator(),但我仍然得到排毒超时。

我一直在整个应用程序中寻找杂散的 JS 计时器或动画,看看我是否遗漏了 RNN 注册调用正在加剧的东西。但我现在不知所措。

【问题讨论】:

【参考方案1】:

这最终是由 d3-timer 在加载时启动的 JS 计时器引起的,该计时器已包含在 Victory Native 中。 https://github.com/FormidableLabs/victory-native/issues/588

【讨论】:

也偶然发现了这个问题,因此对于任何试图找出某人可能在哪里注册间隔或超时的提示,您可以简单地在代码中输入 setTimeout = nullsetInterval = null (在正确的位置)并查看调用它的其他代码的堆栈跟踪。这就是我如何找到设置计时器的位置

以上是关于使用 React Native Navigation 注册大量屏幕时,Detox 卡在 JS Timer/Main Run Loop 上的主要内容,如果未能解决你的问题,请参考以下文章

更新 react-native-maps 以使用 create-react-native-app

react-native字体react-native-vector-icons在ios下的使用

在另一个 React-Native 库中使用 React-Native 库

更新 react-native 后无法使用 react-native-debugger

React Native 速成 002 — 使用 UI框架 React Native Elements

React Native:对原生依赖使用自动链接“react-native-maps”