计时器
定时器是应用程序的重要组成部分,React Native 实现的是浏览器定时器。
定时器
setTimeout和clearTimeoutsetInterval和clearIntervalsetImmediate和clearImmediaterequestAnimationFrame和cancelAnimationFrame
requestAnimationFrame(fn) 与 setTimeout(fn, 0) 不同——前者在所有帧刷新后执行,而后者会尽快执行(在 iPhone 5S 上每秒超过 1000 次)。
setImmediate 在当前 JavaScript 执行块的末尾执行,紧接着在将批处理的响应发送回原生之前。请注意,如果你在 setImmediate 回调中调用 setImmediate,它将立即执行,中间不会返回给原生。
Promise 的实现使用 setImmediate 作为其异步实现。
在 Android 上进行调试时,如果调试器和设备之间的时间发生漂移;动画、事件行为等可能会无法正常工作,或者结果可能不准确。请通过在调试器机器上运行 adb shell "date `date +%m%d%H%M%Y.%S%3N`" 来纠正此问题。在真机上使用需要 root 权限。
InteractionManager
InteractionManager 的行为已更改为与 setImmediate 相同,应优先使用 setImmediate。
精心构建的原生应用程序感觉如此流畅的一个原因是,在交互和动画期间避免了昂贵的操作。在 React Native 中,目前我们有一个限制,只有一个 JavaScript 执行线程,但你可以使用 InteractionManager 来确保长时间运行的任务在任何交互/动画完成后开始。
应用程序可以通过以下方式调度任务以在交互后运行:
InteractionManager.runAfterInteractions(() => {
// ...long-running synchronous task...
});
与此比较其他的调度替代方案
- requestAnimationFrame(): 用于随时间动画视图的代码。
- setImmediate/setTimeout/setInterval(): 稍后运行代码,请注意这可能会延迟动画。
- runAfterInteractions(): 稍后运行代码,而不会延迟活动动画。
触摸处理系统将一个或多个活动触摸视为“交互”,并将 runAfterInteractions() 回调延迟到所有触摸结束或被取消。
InteractionManager 还允许应用程序通过在动画开始时创建一个交互“句柄”,并在完成时清除它来注册动画。
const handle = InteractionManager.createInteractionHandle();
// run animation... (`runAfterInteractions` tasks are queued)
// later, on animation completion:
InteractionManager.clearInteractionHandle(handle);
// queued tasks run if all handles were cleared