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
三大流程