requestLayout问题这么问?哪个Android研发能会?,android开发视频播放全屏选集

本文详细解析了Android中requestLayout的工作原理,指出在Activity stopped状态下requestLayout不会执行。并通过实例展示了onResume如何触发之前挂起的layout方法。同时,介绍了Choreographer的VSync机制,解释了其如何协调UI更新。
摘要由CSDN通过智能技术生成

mTraversalRunnable相对比较简单,它的作用就是从ViewRootImpl 从上往下执行performMeasure、performLayout、performDraw。「[重点:敲黑板]它的执行时机是当VSync信号来到时,会往主线程的Handler对应的MessageQueue中发送一条异步消息,由于在scheduleTraversals()中给MessageQueue中发送过一条同步屏障消息,那么当执行到同步屏障消息时,会将异步消息取出执行」

第三层(TraversalRunnable)

==================================================================================

当VSync信号量到达时,Choreographer会发送一个异步消息。当异步消息执行时,会触发ViewRootImpl.mTraversalRunnable回调。

final class TraversalRunnable implements Runnable {

@Override

public void run() {

doTraversal();

}

}

void doTraversal() {

if (mTraversalScheduled) {

mTraversalScheduled = false;

mHandler.getLooper().getQueue().removeSyncBarrier(mTraversalBarrier);

if (mProfile) {

Debug.startMethodTracing(“ViewAncestor”);

}

performTraversals();

if (mProfile) {

Debug.stopMethodTracing();

mProfile = false;

}

}

}

它的作用:

  1. 移除同步屏障。

  2. 执行performTraversals方法。

performTraversals()方法特别复杂,给出伪代码如下:

private void performTraversals() {

if (!mStopped || mReportNextDraw) {

performMeasure()

}

final boolean didLayout = layoutRequested && (!mStopped || mReportNextDraw);

if (didLayout) {

performLayout(lp, mWidth, mHeight);

}

boolean cancelDraw = mAttachInfo.mTreeObserver.dispatchOnPreDraw() || !isViewVisible;

if (!cancelDraw && !newSurface) {

performDraw();

}

}

该方法的作用:

  1. 满足条件的情况下调用performMeasure()。

  2. 满足条件的情况下调用performLayout()。

  3. 满足条件的情况下调用performDraw()。

mStopped表示Activity是否处于s

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值