您的位置:首页 > 其它

ViewRootImpl的连接时机

2021-12-24 13:29 85 查看

ActivityThread在使用handleResumeActivity方法调用了activity的onResume方法之后,就调用了

wm.addView(decor, LayoutParams)

wm其实是WindowManagerGlobal

所以调用了

WindowManagerGlobal.addView

里面创建了view root impl,并把decor view作为view root impl的子view。

所以,在onResume方法之前,一个view的最顶层都是decor view,之后就是view root impl了。

而在子线程中更改UI会报错是因为调用了view root impl的方法,所以在onResume执行之前,比如onCreate,在子线程中更改UI是没有问题的。因为没有View root impl.

override fun onCreate(savedInstanceState: Bundle?) {
......
thread {
binding.view1.text = "fadfasdf"
var parent = binding.view1.parent
while (parent != null) {
Log.d("Right", parent.javaClass.canonicalName)
parent = parent.parent
}
}

binding.view1.setOnClickListener{
var parent = binding.view1.parent
while (parent != null) {
Log.d("Right", parent.javaClass.canonicalName)
parent = parent.parent
}
}
}
androidx.constraintlayout.widget.ConstraintLayout
androidx.appcompat.widget.ContentFrameLayout
androidx.appcompat.widget.ActionBarOverlayLayout
android.widget.FrameLayout
android.widget.LinearLayout
com.android.internal.policy.DecorView

点击时的:

androidx.constraintlayout.widget.ConstraintLayout
androidx.appcompat.widget.ContentFrameLayout
androidx.appcompat.widget.ActionBarOverlayLayout
android.widget.FrameLayout
android.widget.LinearLayout
com.android.internal.policy.DecorView
android.view.ViewRootImpl

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: