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