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

你可能感兴趣的