众所周知,Android是不可以在子线程中直接更新UI的,需要借助Handler或者View.post(Runnable runnable)或者runOnUIThread(Runnable runnable)将更新的代码切入到主线程中去实现UI更新。
我们来试一下,在Activity的 onCreate中直接在新线程中去更新一个TextView的文本,结果发现,WHAT?竟然没有抛出异常,更新也成功了?
这是因为在onCreate中尚未完成View的绘制,此时TextView中有个变量mLayout仍为null,setText时不执行重绘,没有运行到抛出线程异常的代码,但是相应的text却变化了。在Activity分发子View的Layout后,绘制的时变化后的text,故不抛出异常。其他View如ImageView也有类似现象出现。
如果在textview.getViewTreeObserver().addOnGlobalLayoutListener(OnGlobalLayoutListener listener)中添加监听绘制完毕的事件,然后再在子线程中更新UI,则会抛出异常。
归根结底,不能钻这个空子,不优美、不安全!