react本机警告:“设置一个很长一段时间的计时器......”。如何定位原因?

IT技术 android node.js reactjs react-native
2021-05-20 09:10:51

iOS 上的一切正常。在 Android 上,我收到警告“长时间(即几分钟)设置计时器是 Android 上的性能和正确性问题,因为它使计时器module保持唤醒状态,并且计时器只能在应用程序处于前景。有关更多信息,请参阅https://github.com/facebook/react-native/issues/12981。(看到 setTimeout 持续时间为 589668ms)”

我没有在我的应用程序中使用任何计时器,所以我假设这是来自我安装的 NPM module。我如何确定是哪一个导致了这种情况?

我看到我可以忽略 waring,但我想向module维护者报告这个问题。

4个回答

这是一个警告,某些 javascript 依赖项将由于其方面的问题而在 react-native 上引发,并且必须在 react-native 的代码库中解决,但这不是引起关注的原因。如果它打扰你只需添加console.ignoredYellowBox = ['Setting a timer'];. 要找出导致它的依赖项,您必须使用 chrome 调试应用程序并确保启用了源映射。

https://github.com/facebook/react-native/issues/12981说你需要编辑服务器上的文件。在你的 index.js 文件中

var server = require('https').Server(options, app);
var io = require('socket.io')(server);

改成

var server = require('https').Server(options, app);
var io = require('socket.io')(server,{pingTimeout: 30000});

然后运行forever restartall重新启动

此链接将帮助您 https://github.com/facebook/react-native/issues/12981#issuecomment-499827072

代码(来自此处:firebase/firebase-js-sdk#97(评论))简单地包装了 setTimeout(全局)函数,以防止它被长时间使用。

在我们修改的 global.setTimeout 函数中,如果持续时间大于阈值 MAX_TIMER_DURATION_MS,我们将一个 id 保存在本地映射 (timerFix) 中,然后调用 runTask 将持续时间拆分为更小的值。runTask 使用较小的块设置超时(使用原始 _setTimeout),这些块将连续执行,直到waitingTime 太小。当waitingTime 足够小时,我们调用React Native 的runAfterInteractions 来平滑执行,同时,我们从本地映射中移除id 条目,因为在这种情况下我们不会再次调用_setTimeout。请注意,afterTime 被送入 _setTimeout 以防止它被长时间调用。

否则,在我们修改的 global.setTimeout 函数中,如果持续时间小于阈值 MAX_TIMER_DURATION_MS,我们直接调用全局 setTimeout(保存在 _setTimeout 中)。

全局 clearTimeout 也被包装以通过从本地地图中删除 id 来执行清理过程。

对于 firebase/firestore 用户:我只是恢复直接使用 REST 端点进行 firestore 调用,而不是试图掩盖警告。由于我只需要 auth 和 firestore,这很容易解决了我的问题。片段在这里:

https://stackoverflow.com/a/62446792