[英]How to prevent setInterval in react native from blocking running animation?
我有一个反应本地应用程序。 有2个部分:票证和票证详细信息。 在“票证”组件中,有一个票证列表。 当用户单击单个票证时,将显示“票证详细信息”组件。 在“票证”组件中,有一个setInterval,它每10秒从服务器检索一次票证。 在“门票详细信息”组件中,有动画进度条(使用react native Animated模块)。
问题:“门票详细信息”组件中的动画每10秒冻结一次。 怎么解决?
我猜这是因为setInterval
阻止了主UI线程。
我想: - https://facebook.github.io/react-native/docs/interactionmanager.html ,但我甚至不设法打电话对我的RN 0.58 runAfterInteractions。
接下来想到的是https://github.com/joltup/react-native-threads 。 但这是一个本机模块,存在一些令人恐惧的问题,例如“内存泄漏”和其他构建指令,因此我真的不想使用它。
我想我想念一种更简单的方法来解决这个问题。
这就是我在“票证”组件中获取票证的方式。 getTickets是一个redux操作。
componentDidMount() {
this.timer = setInterval(() => {
const {getTickets} = this.props;
getTickets();
}, 10000);
}
这是“票证详细信息”组件中的动画进度条。 我怀疑这在此问题上是否有用。 仅供参考。
<ProgressBarAnimated
value={100}
barAnimationDuration={progressBarAnimationDuration}
width={progressBarWidth}
borderWidth={0}
backgroundColor='#1d1e1f'
height={8}
borderRadius={0} />
我希望setInterval
不会冻结进度栏动画。
我再次看到该过程:
进度条动画正在运行
每隔10秒setInterval
执行HTTP请求并阻塞主UI线程(带有进度条动画)2秒钟
请求完成后,动画恢复正常
动画被阻止,因为它在JS线程而不是UI线程中运行。
您应该通过https://facebook.github.io/react-native/docs/animated在UI线程中运行动画,并带有useNativeDriver:true选项。 使用此选项,动画将变得流畅。
另请注意,如果您使用PanResponder + Animated,则useNativeDriver选项不起作用 。 您可以使用https://github.com/wix/react-native-interactable 。 我已经尝试过,并且所有触摸动画都在UI线程中运行,因此动画不会被阻止。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.