View的Temporary Detach状态
View的Temporary Detach状态
探究TemporaryDetach与Detach的关系
切入点
起因是在分析RecyclerView缓存机制时,在类注释描述的Scrap中,提到了处于temporary detached状态的View。
直接在View方法表中搜索temporary可发现一系列方法。
源码分析
对于View来说:
通过对比dispatchStartTemporaryDetach和dispatchDetachedFromWindow
public void dispatchStartTemporaryDetach() {
mPrivateFlags3 |= PFLAG3_TEMPORARY_DETACH;
notifyEnterOrExitForAutoFillIfNeeded(false);
notifyAppearedOrDisappearedForContentCaptureIfNeeded(false);
onStartTemporaryDetach();
}
void dispatchDetachedFromWindow() {
...
notifyEnterOrExitForAutoFillIfNeeded(false);
notifyAppearedOrDisappearedForContentCaptureIfNeeded(false);
}
可以发现前者是后者是轻量级操作,只做了一小部分处理,几乎没什么影响。onStartTemporaryDetach方法注释中提到了ViewGroup#detachViewFromParent(View),我们转移到分析ViewGroup:
protected void detachViewFromParent(View child) {
child.setDetached(true);
removeFromArray(indexOfChild(child));
}
在ViewGroup的视角下,Detach对应removeView,对比detachViewFromParent和removeView,可以发现,也是属于轻量级操作,只是简单的从视图层级结构中移除了。
结论
TemporaryDetach是Detach的轻量级操作,好处是期间不参与layout、draw、measure三大流程
浙公网安备 33010602011771号