无意间发现进入某个页面时,一个自定义ViewGroup控件的onLayout方法每秒都在输出日志。在它的onLayout方法,会对子View的位置进行计算然后重新排列,这样无疑是非常耗性能的。通过排查发现,是因为我们每秒都在调用TextView的setText方法导致的。为什么调用setTextView会导致父View的onLayout方法被触发呢?
通过代码看一看吧:
TextView.java
1 | private void setText(CharSequence text, BufferType type, |
checkForRelayout方法是罪魁祸首,我们来看一下它的实现:
TextView.java
1 | private void checkForRelayout() { |
对应项目中的问题就是,在某一次提交的时候,把这个美妙刷新文字的TextView的width改成了wrap_content,导致了每次调用setText时都会调用relayout方法。
解决方法:为TextView的width设置一个合适的dp值。