抖音字体大小设置方法安卓 抖音字体大小设置方法( 九 )


LayoutParams 的问题
异步 Inflate 除了多线程锁的问题,另一个问题就是 LayoutParams 问题 。
LayoutInflater 对 View LayoutParam 处理主要依赖于 root 参数,对于 root 不为 null 的情况,在 inflate 的时候将会为 View 构造一个 root 关联类型的 LayoutParams,并且为其设置 LayoutParams,但是我们在进行异步 Inflate 的时候是拿不到根布局的,如果传入的 root 为 null,那么被 Inflate 的 View 的 LayoutParams 将会为 null,在这个 View 被添加到父布局时会采用默认值,这会导致被 Inflate view 的属性丢失,解决这个问题的办法就是在进行预加载时候 new 一个相应类型的 root,以实现对待 inflate view 属性的正确解析 。
public View inflate(XmlPullParser parser, @Nullable ViewGroup root, boolean attachToRoot) {
// 省略其他逻辑
if (root != null) {
// Create layout params that match root, if supplied
params = root.generateLayoutParams(attrs);
if (!attachToRoot) {
// Set the layout params for temp if we are not
// attaching. (If we are, we use addView, below)
root.setLayoutParams(params);
}
}
}
public void addView(View child, int index) {
LayoutParams params = child.getLayoutParams();
if (params == null) {
params = generateDefaultLayoutParams();
if (params == null) {
throw new IllegalArgumentException("generateDefaultLayoutParams() cannot return null");
}
}
addView(child, index, params);
}
其他问题
除了上面提到的多线程锁的问题和 LayoutParams 的问题,在进行预加载过程中还遇到了一些其他的问题,这些问题具体如下:
inflate 线程优先级的问题:一般情况下后台线程的优先级会比较低,在进行异步 inflate 时可能会因为 inflate 线程优先级过低导致来不及预加载甚至比不进行预加载更耗时的情况,在这种情况下建议适当提升异步 inflate 线程的优先级 。对 Handler 问题:存在一些自定义 View 在创建的时候会去创建 handler,这种情况下我们需要去修改创建 Handler 的代码,为其指定主线程的 Looper 。对线程有要求:典型的就是自定义 View 里使用了动画,动画在 start 时会校验是否是 UI 线程主线程,这种情况我们需要去修改业务代码,将相关逻辑移动到后续真正添加到 View tree 时 。需要使用 Activity context 的场景:一种解决办法就是在 Activity 启动之后再进行异步预加载,这种方式无需专门处理 View 的 context 问题,但是预加载的并发空间可能会被压缩;另一种方式就是在 Application 阶段利用 Applicaiton 的 context 进行预加载,但是在 add 到 view tree 之前将预加载 View 的 context 替换为 Activity 的 context,以满足 Dialog 显示、LiveData 使用等场景对 Activity context 的需求 。1.6 主线程耗时消息优化
以上我们基本介绍了主线程各大生命周期的相关优化,在抖音的实际优化过程中我们发现一些被 post 在这些生命周期之间的主线程耗时消息也会对启动速度造成影响 。比如 Application 和 Activity 之间、Activity 和 UI 渲染之间 。这些主线程消息会导致我们后续的生命周期被延后执行,影响启动速度,我们需要对它们进行优化 。
1.6.1 主线程消息调度
对于自己工程中的代码,我们可以比较方便的优化;但是有些是第三方 SDK 内部的逻辑,我们比较难以进行优化;即使是方便优化掉的消息后期的防止劣化成本也非常高 。我们尝试从另外一个角度解决这个问题,在优化部分往主线程 post 消息的同时,对主线程消息队列进行调整,让启动相关的消息优先执行 。

抖音字体大小设置方法安卓 抖音字体大小设置方法


我们的核心原理是根据 App 启动流程确定核心启动路径,利用消息队列调整来保证冷启动场景涉及相关消息优先调度,进而提高启动速度,具体来说包括如下:

推荐阅读