使用 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
调用切换为注册到内联 require
s 的 RNN 屏幕。但这会让我们失去对所有这些屏幕组件的类型检查。我试过使用Navigation.setLazyComponentRegistrator()
,但我仍然得到排毒超时。
我一直在整个应用程序中寻找杂散的 JS 计时器或动画,看看我是否遗漏了 RNN 注册调用正在加剧的东西。但我现在不知所措。
【问题讨论】:
【参考方案1】:这最终是由 d3-timer 在加载时启动的 JS 计时器引起的,该计时器已包含在 Victory Native 中。 https://github.com/FormidableLabs/victory-native/issues/588
【讨论】:
也偶然发现了这个问题,因此对于任何试图找出某人可能在哪里注册间隔或超时的提示,您可以简单地在代码中输入setTimeout = null
或 setInterval = 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