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