如題,正常更新沒有拋出例外
uj5u.com熱心網友回復:
網上的例子全試過了,都正常更新uj5u.com熱心網友回復:
getWindowManager的方法更新不行,但是textView的setText沒一點問題uj5u.com熱心網友回復:
并不可以哦,你可以看看原始碼就知道了。實際上不能在執行緒中更新UI的原因,是因為 requestLayout 時會呼叫 checkThread 方法。而 TextView 會在 checkForRelayout 檢測是否需要 requestLayout。你可以試試TextView高度設定為 WRAP_CONTENT ,然后在執行緒設定一大段文本,可以讓他換行改變高度。就會觸發 requestLayout 方法,此時就會導致崩潰uj5u.com熱心網友回復:
懂了,不需要重新測量大小就不會檢查執行緒
uj5u.com熱心網友回復:
我又試了一下,子執行緒可以invalidate怎么回事,而且如果checkForRelayout判斷不需要requestLayout的話就會走invalidate,但是為什么都說子執行緒不能invalidate啊
uj5u.com熱心網友回復:
自己去探尋一下嘛。。這就是一個學習的程序
uj5u.com熱心網友回復:
并不可以哦,你可以看看原始碼就知道了。實際上不能在執行緒中更新UI的原因,是因為 requestLayout 時會呼叫 checkThread 方法。而 TextView 會在 checkForRelayout 檢測是否需要 requestLayout。你可以試試TextView高度設定為 WRAP_CONTENT ,然后在執行緒設定一大段文本,可以讓他換行改變高度。就會觸發 requestLayout 方法,此時就會導致崩潰
我又試了一下,子執行緒可以invalidate怎么回事,而且如果checkForRelayout判斷不需要requestLayout的話就會走invalidate,但是為什么都說子執行緒不能invalidate啊
自己去探尋一下嘛。。這就是一個學習的程序
androidstudio原始碼一片隱藏,除錯起來很惡心,不過最后還是找到了。網上都view的invalidateInternal方法會呼叫父view的invalidateChild,然后一個do while回圈父view不斷找自己的父view,直到呼叫ViewRootImpl.invalidateChildInParent,在這里會檢查當前執行緒。但是我用的小米手機不是這樣的,在父view的invalidateChild會先檢查一個硬體加速標志,然后就不斷呼叫父view的onDescantInvalidated,直到到達ViewRootImpl.onDescntInvalidated調,。最后發現invalidate和requestLayout除了不檢查執行緒,都是呼叫了scheduleTraversals。不知道是誰的功能用了個加速和網上說的呼叫程序不一樣
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/108429.html
標籤:Android
下一篇:這段代碼為什么不會崩潰
