关于子线程更新UI那些事儿

2017-05-11  本文已影响0人  子沐_

我们都知道子线程不能更新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

上一篇下一篇

猜你喜欢

热点阅读