浅谈Android invalidate 分析
浅谈Android invalidate 分析 Android 系统中的invalidate机制是View树中非常重要的一部分,它负责对View树进行重绘和更新。当我们对View进行修改时,需要调用invalidate方法来触发重绘过程。那么,今天我们就来浅谈一下Android中的invalidate机制。 我们来看一下invalidate和postInvalidate的关系。postInvalidate是通过Handler切换回到主线程,然后在调用invalidate的。我们可以通过源码来了解它的实现细节: ```java public void postInvalidate() { postInvalidateDelayed(0); } public void postInvalidateDelayed(long delayMilliseconds) { // We try only with the AttachInfo because there's no point in invalidating // if we are not attached to our window final AttachInfo attachInfo = mAttachInfo; if (attachInfo != null) { attachInfo.mViewRootImpl.dispatchInvalidateDelayed(this, delayMilliseconds); } } ``` 在ViewRootImpl中,我们可以看到dispatchInvalidateDelayed方法的实现: ```java public void dispatchInvalidateDelayed(View view, long delayMilliseconds) { Message msg = mHandler.obtainMessage(MSG_INVALIDATE, view); mHandler.sendMessageDelayed(msg, delayMilliseconds); } ``` 在这里,我们可以看到postInvalidate方法是通过Handler来切换到主线程,然后调用invalidate方法的。那么,为什么需要使用postInvalidate方法呢?这是因为invalidate方法只能在主线程中调用,而postInvalidate方法可以在任何线程中调用。 接下来,让我们讨论一下子线程是否可以更新UI的问题。答案是可以的。在Activity的onCreate方法中,我们可以直接开启子线程并在子线程中更新UI。下面是一个示例代码: ```java public class MainActivity extends Activity { private TextView tvText; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvText = (TextView) findViewById(R.id.main_tv); new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } tvText.setText("OtherThread"); } }).start(); } } ``` 这里,我们在子线程中更新了TextView的文字,但是这并不是一个好的做法。因为,UI更新只能在主线程中进行,而子线程不能直接更新UI。那么,为什么这里可以更新UI呢?这是因为Activity的onCreate方法是在主线程中调用的,而我们在子线程中更新UI时,实际上是通过Handler来切换到主线程的。 让我们来讨论一下ViewRootImpl的创建流程。在Activity的onResume方法中,ViewRootImpl将被创建: ```java final void handleResumeActivity(IBinder token, boolean clearHide, boolean isForward, boolean reallyResume, int seq, String reason) { ActivityClientRecord r = mActivities.get(token); ... if (r != null) { final Activity a = r.activity; if (r.window == null) { ... r.window = new Window(a.getBaseContext(), a); ... } ... } } ``` 在这里,我们可以看到ViewRootImpl的创建流程是在Activity的onResume方法中进行的。这个流程将ViewRootImpl与Activity关联起来,从而实现了UI的更新和重绘。
剩余8页未读,继续阅读
- 粉丝: 5
- 资源: 997
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 深圳建设工程公司考勤休假管理规定.docx
- 深圳建设工程公司员工工作规范和行为准则.docx
- 深圳建设工程公司员工奖惩管理规定.docx
- 深圳建设工程公司资料管理制度.docx
- 空中俯视物体检测9-YOLOv5数据集合集.rar
- CA法模拟动态再结晶,晶粒正常长大,利用元胞自动机生成拓扑晶粒模型,参数可调 元胞胞自动机模拟动态再结晶母相晶粒生成 本程序基于曲率驱动机制以及热激活机制,matlab编写,本程序模拟奥氏体晶粒正
- 无人船 无人艇路径跟踪控制 fossen模型matlab simulink效果 基于观测器的LOS制导结合反步法控制 ELOS+backstepping
- Labview Ethernetip TCP网口通讯欧姆龙PLC OmronNX1P2NJ501NJ301PLC标签通讯 CIP通讯比Fins通讯更完美 1.自定义变量读写 2.支持 Bool单点或
- Python基于深度学习的垃圾分类目标检测系统
- 空中救援任务检测2-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord、VOC数据集合集.rar
- 该模型采用离散化的龙贝格观测器进行无传感器控制 其利用 PMSM 数学模型构造观测器模型,根据输出的偏差反馈信号来进行PLL得到速度和角度 当观测的电流实现与实际电流跟随时,可以从观测的反电势计算得
- Python毕业设计-基于深度学习的垃圾分类目标检测系统源码
- Python毕设基于深度学习的垃圾分类目标检测系统源码
- 《STM32单片机+2x180-SG90+2x360-SG90+OLED屏幕》源代码
- 本科毕设-基于三维卷积神经网络的卒中患者疲劳检测详细文档+全部资料+优秀项目+源码.zip
- 本科毕设-基于卷积神经网络的红外图像非均匀性校正详细文档+全部资料+优秀项目+源码.zip