我们都知道子线程不能更新UI,但是测试的时候发现,onCreate方法中子线程是可以更新UI的,onResume就不行
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:5971)
1.异常发生在ViewRootImpl的checkThread
2.onCreate过程中主要是通过setContentView方法在PhoneWindow中创建DecorView,DecorView包含我们创建的xml布局,并没有ViewRootImpl相关类
3.ViewRootImpl创建发生在onResume,随后将DecorView加入ViewRootImpl,这是更新UI会触发ViewRootImpl的checkThread方法
总结
onCreate之所以可以子线程更新UI是因为此时我们的根视图没有加入ViewRootImpl,所以就没有检查线程的操作
onResume方法之后,因为根视图已经加入ViewRootImpl,所以会触发checkThread操作,所以不能进行子线程UI更新
所以,子线程不能更新UI的原因在于子线程中不持有ViewRootImpl的对象,所以无法更新UI
网友评论