乐趣区

关于android:View的Temporary-Detach状态

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

退出移动版