美文网首页
React - Native InteractionManage

React - Native InteractionManage

作者: 有情怀的程序猿 | 来源:发表于2017-03-01 11:17 被阅读0次
    动画交互管理器 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});
        });
      }
    

    这里就是执行转场动画

    相关文章

      网友评论

          本文标题:React - Native InteractionManage

          本文链接:https://www.haomeiwen.com/subject/ftrqgttx.html