1. 程式人生 > >Android 子執行緒更新UI 異常

Android 子執行緒更新UI 異常

眾所周知,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,則會丟擲異常。

歸根結底,不能鑽這個空子,不優美、不安全!