React - Native InteractionManager 动画交互管理器

动画交互管理器 InteractionManager

参考了官方性能
参考了官方InteractionManager

InteractionManager可以将一些耗时较长的工作安排到所有互动或动画完成之后再进行。这样可以保证JavaScript动画的流畅运行。比如 Navigator的转场动画

对大多数React Native应用来说,业务逻辑是运行在JavaScript线程上的。这是React应用所在的线程,也是发生API调用,以及处理触摸事件等操作的线程。更新数据到原生支持的视图是批量进行的,并且在事件循环每进行一次的时候被发送到原生端,这一步通常会在一帧时间结束之前处理完(如果一切顺利的话)。如果JavaScript线程有一帧没有及时响应,就被认为发生了一次丢帧。 例如,你在一个复杂应用的根组件上调用了this.setState,从而导致一次开销很大的子组件树的重绘,可想而知,这可能会花费200ms也就是整整12帧的丢失。此时,任何由JavaScript控制的动画都会卡住。只要卡顿超过100ms,用户就会明显的感觉到。

这种情况经常发生在Navigator的切换过程中:当你push一个新的路由时,JavaScript需要绘制新场景所需的所有组件,以发送正确的命令给原生端去创建视图。由于切换是由JavaScript线程所控制,因此经常会占用若干帧的时间,引起一些卡顿。有的时候,组件会在componentDidMount函数中做一些额外的事情,这甚至可能会导致页面切换过程中多达一秒的卡顿。

另一个例子是触摸事件的响应:如果你正在JavaScript线程处理一个跨越多个帧的工作,你可能会注意到TouchableOpacity的响应被延迟了。这是因为JavaScript线程太忙了,不能够处理主线程发送过来的原始触摸事件。结果TouchableOpacity就不能及时响应这些事件并命令主线程的页面去调整透明度了。

为了避免这种情况,解决办法就是在转场动画中不要让js来干别的事情。InteractionManager, 让其专心做动画, 在动画之后再执行其他的事

InteractionManager的一些属性方法

runAfterInteractions(task)  静态方法,在用户交互和动画结束以后执行任务
createInteractionHandle() 静态方法,创建一个句柄(处理器),通知管理器,某个动画或者交互开始了
clearInteractionHandle(handler:Handle)  静态方法,进行清除句柄,通知管理器,某个动画或者交互结束了。
setDeadline(deadline:number) 静态方法, 设置延迟时间,该会调用setTimeout方法挂起并且阻塞所有没有完成的任务,然后在eventLoopRunningTime到设定的延迟时间后,然后执行setImmediate方法进行批量执行任务
Events:CallExpression
addListener:CallExpression

我们主要是使用 runAfterInteractions

InteractionManager.runAfterInteractions(() => {
    navigator.push({
        component: MainPager,
        name: 'MainPager'
    })
})

或者设置state

  componentDidMount() {
    InteractionManager.runAfterInteractions(() => {
      this.setState({renderPlaceholderOnly: false});
    });
  }

这里就是执行转场动画

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,803评论 25 709
  • title: React Native 学习笔记--进阶(五)--性能、升级版本、特定平台代码tags: Reac...
    呼呼哥阅读 1,166评论 0 4
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,262评论 4 61
  • 大把的时光是我们年轻的资本,但也要度过。人还是有个梦想的好,是否会见鬼不清楚,至少伴随我们走过漫长的岁月。先定个小...
    厌屋及乌阅读 302评论 1 2
  • 哇,感动真得是暖人心呀! 与昨天上班的区长交接,他跟我说啥都没备料,盒子都是空空的,让我好自为之。 进了区站,一打...
    小黄丫阅读 144评论 0 0