iOS上的一切都运行良好。在Android上我收到警告"长时间设置计时器,即多分钟,是Android上的性能和正确性问题,因为它使计时器模块保持清醒状态,并且只有在应用程序时才能调用计时器在前台。有关详细信息,请参阅https://github.com/facebook/react-native/issues/12981。 (看到setTimeout,持续时间为589668ms)"
我不会在我的应用中使用任何计时器,所以我假设这是来自我安装的NPM模块。我怎样才能确定哪一个导致了这个?
我看到我可以ignore the waring,但我想向模块维护者报告此问题。
答案 0 :(得分:2)
这是一个警告,由于他们自己的问题,某些javascript依赖关系将在react-native上引发,必须在react-native的代码库中解决但不是引起关注的原因。如果它困扰你,只需添加console.ignoredYellowBox = ['Setting a timer'];
。要找出导致它的依赖项,您必须使用chrome调试应用程序并确保启用了源映射。
答案 1 :(得分:1)
此链接将为您提供帮助 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来执行清理过程。
答案 2 :(得分:0)
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
重新启动
答案 3 :(得分:0)
对于firebase / firestore用户:我只是简单地还原为直接使用REST端点进行firestore调用,而不是尝试掩盖警告。由于我只需要auth和firestore,因此很容易解决了我的问题。此处的代码段: