首先Android官方并不支持这种做法。Android是单线程模型,如果支持多线程修改View,则线程同步和线程安全问题会使Android的系统设计非常复杂。
举两个情况的例子:
- 在某个Button的点击事件里新建线程对TextView进行setText,必崩Only the original thread that created a view hierarchy can touch its views(只有创建View层次结构的线程才能修改View)
- 在onCreate里新建线程对TextView进行setText,绝大多数情况不会崩溃
原因:
- setText会做invalidate操作更新ui,最终会走到ViewRootImpl.checkThread里,检查线程是不是ui线程,所以报错。
- onCreate时,view还没画出来,setText不会invalidate,相当于只修改了TextView的属性,所以不会走checkThread,不会报错。但如果这个线程耗时较长,actvity生命周期已经到onResume了,那就会崩溃。
非主线程中更新ui的方式:
- 使用Thread+Handler实现非UI线程更新UI界面
- 使用View的post方法来更新UI
- 使用Activity.runOnUiThread(runnable)的方法来更新UI