View的Temporary Detach状态

探索TemporaryDetachDetach的关系

切入点

起因是在剖析RecyclerView缓存机制时,在类正文形容的Scrap中,提到了处于temporary detached状态的View

间接在View办法表中搜寻temporary可发现一系列办法。

源码剖析

对于View来说:

通过比照dispatchStartTemporaryDetachdispatchDetachedFromWindow

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,比照detachViewFromParentremoveView,能够发现,也是属于轻量级操作,只是简略的从视图层级构造中移除了。

论断

TemporaryDetachDetach的轻量级操作,益处是期间不参加layoutdrawmeasure三大流程