Android为什么不允许在子线程中访问UI

首先,UI控件不是线程安全的,如果多线程并发访问UI控件可能会出现不可预期的状态
那为什么系统不对UI控件的访问加上锁机制呢?
缺点有两个:

  • 加上锁机制会让UI访问的逻辑变复杂;
  • 锁机制会降低UI访问的效率,因为锁机制会阻塞某些线程的执行;
    将于这两个缺点,最简单且高效的方法就是采用单线程模型来处理UI操作,所以源码ViewRootImpl中会有对线程的一个判断,代码如下:
    frameworks/base/core/java/android/view/ViewRootImpl.java
    void checkThread() {
        if (mThread != Thread.currentThread()) {
            throw new CalledFromWrongThreadException(
                    "Only the original thread that created a view hierarchy can touch its views.");
        }
    }

对于开发者来说也不是很麻烦,只是通过handler切换一下UI访问的执行线程即可。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 因为Android的UI控件不是线程安全的,如果在多线程中并发访问可能会导致UI控件处于不可预期的状态。 那为什么...
    铜角大王阅读 4,404评论 0 0
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,910评论 1 32
  • Java 多线程 线程和进程的区别 线程和进程的本质:由CPU进行调度的并发式执行任务,多个任务被快速轮换执行,使...
    安安zoe阅读 6,547评论 1 18
  • 一个电话打来,让我失眠到现在。2:41
    夏倾阅读 1,378评论 0 0
  • 听过一句话:孩子所有的问题都是父母造成的。也许真的是这样,父母是孩子的第一任也是最好的老师,很多时候我们当...
    逍枭阅读 3,118评论 0 1

友情链接更多精彩内容