View
//无异常,但是onResume后子线程更新ui会异常
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = findViewById(R.id.tv);
new Thread(new Runnable() {
@Override
public void run() {
tv.setText("Test");
}
}).start();
}主线程更新UI的方法
Handler(mainLooper).post{
tv.setText()
}
runOnUiThread {
tv.setText()
}
view.post{
tv.setText()
}
//AsyncTask也可,onPreExecute,onProgressUpdate,onCancelled,onPostExecute都可以,都有@MainThread标志View 绘制流程
三级绘制流程
View的MeasureSpec。MeasureSpec是一个32位的int值,其中高2位表示测量模式(Mode),低30位表示测量大小(Size)。它用于在测量过程中将父容器的约束传递给子View。
三种模式详解
1. EXACTLY(精确模式)
2. AT_MOST(最大模式)
3. UNSPECIFIED(未指定模式)
核心计算规则
1. MeasureSpec 的生成(父容器决定子 View 的约束)
2. 自定义 View 中的测量处理
3. 实际测量示例
核心区别概览
详细解析
1. invalidate()- 请求重绘
invalidate()- 请求重绘2. requestLayout()- 请求重新布局
requestLayout()- 请求重新布局实际调用链分析
源码层面分析
invalidate()的关键实现
invalidate()的关键实现requestLayout()的关键实现
requestLayout()的关键实现组合使用场景
场景1:先改变尺寸,再改变内容
场景2:自定义View中
Last updated