没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
在Android开发过程中,我们常常遇到子线程更新UI的需求,例如在子线程进行耗时较长的下载,等下载完成之后,再去更新UI,提示用户下载完成,直接在子线程里更新UI,会得到报错提示:Only the original thread that created a view hierarchy can touch its views。 Android老手知道这是怎么回事,并且知道解决方案,新手只能去网上找答案,网上的答案告诉我们报错是因为子线程不能直接更新UI线程,也就是主线程的控件,必须通过Android消息机制来更新。略微遗憾的是,网上的答案要么仅仅是罗列了可用方案的代码片段,不知道背后的原理
资源推荐
资源详情
资源评论
Android消息机制基本原理和使用消息机制基本原理和使用
在Android开发过程中,我们常常遇到子线程更新UI的需求,例如在子线程进行耗时较长的下载,等下载完成之后,再去更新UI,提示用
户下载完成,直接在子线程里更新UI,会得到报错提示:Only the original thread that created a view hierarchy can touch its
views。
Android老手知道这是怎么回事,并且知道解决方案,新手只能去网上找答案,网上的答案告诉我们报错是因为子线程不能直接更新UI线
程,也就是主线程的控件,必须通过Android消息机制来更新。略微遗憾的是,网上的答案要么仅仅是罗列了可用方案的代码片段,不知
道背后的原理是什么,要么是陷入源码分析的细节中,看完之后的感觉作者早就走远了,我们还在源代码细节中晕头转向。
为此,决定自己写一篇,如果能用通俗语言说明白,表明自己也会了。
2.为什么其他线程不能直接访问为什么其他线程不能直接访问UI线程?线程?
要回答这个问题,可以反过来想一想,如果子线程能够访问UI线程会怎样?Android的UI线程是非线程安全,非线程安全是***不对数据
进行加锁保护,多线程访问数据时,导致出现数据不一致或者数据污染情况***,例如两个线程同时设置同一个UIView的背景颜色,那么
很有可能渲染显示的是颜色A,而此时在UIView逻辑上的背景颜色属性为B,因此假如子线程能直接修改UI控件的话,会导致出现不可
预期结果,那么UI线程为什么不设置成线程安全呢?要设置成线程安全需要加锁,即当一个线程访问该类的某个数据时,会对这个数据
进行保护,其他线程不能对其访问,直到该线程读取完之后,其他线程才可以使用。但这样做会降低执行效率,如果一个子线程长时间
占据着,其他线程只能干等,而UI界面直接面对用户,是Android的门面,首先要保证响应快,越快越好,因此UI线程只能是非线程安
全。
既然是非线程安全,又不想让子线程随便修改,只能禁止子线程直接访问UI线程的控件。
既然子线程不能直接访问UI,那怎么实现更新UI呢?这就用到了Android消息机制。
3.Android消息机制消息机制
什么是Android消息机制?说白了是跨线程跨线程传递信息机制,注意这里是跨线程,不是跨进程,Android里跨进程通信使用Binder,跨线程
传递消息使用消息机制,为什么跨线程通信不使用Binder?
我们知道不同进程内存空间是隔离的,而一个进程里不同线程共享内存空间,用日常生活来理解就是,不同进程好比是不同的房子,一
个进程是一间房子,而一个进程里包含不同线程,这些线程就像是不同的人,例如你,你父母,你老婆孩子,这些家庭成员同在一个房
子里,也就是共享内存空间。
两个进程两间房子,相互之间通信使用电话沟通,而同在一个房间里的不同线程还使用电话沟通效率降低了,这也是为什么不同线程之
间不用Binder的原因。
你可能会问,既然家庭成员同在一间房里时,直接面对面喊话不就行了吗,为什么还设计消息机制来沟通,不还是降低效率了吗?这又
回到上节里说的,如果直接喊话就响应,让子线程直接访问UI线程,会导致混乱,这可以由日常生活的例子来理解,假设由你掌控遥控
资源评论
weixin_38648800
- 粉丝: 3
- 资源: 946
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Whisper-v1.0.0.2-x64-setup.exe
- java固定资产管理系统源码数据库 MySQL源码类型 WebForm
- mmexport1731941345010.jpg
- C#机械制造业信息管理系统源码数据库 Access源码类型 WinForm
- 【python毕业设计】智能旅游推荐系统源码(完整前后端+mysql+说明文档+LW).zip
- springboot美容院管理系统(代码+数据库+LW)
- 【python毕业设计】学生成绩管理系统源码(完整前后端+mysql+说明文档+LW).zip
- 商道融绿、润灵环球ESG评级数据(2015-2023年)dta
- 【python毕业设计】疫情数据可视化分析系统源码(完整前后端+mysql+说明文档+LW).zip
- elasticsearch-analysis-dynamic-synonym 8.16.0
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功