Android消息机制字典型探究(一)

子线程为啥不能更新UI?

本文原创,转载请经过本人准许。

开心一刻

写在前面:

看到Android消息机制这几个字眼,相信大家脑海中第一时间就浮现出了Handler这个单词,关于这个知识点,几乎是面试必问的问题,重要程度不言而喻。我曾花了大致一周多的时间去研究它,本打算将其有关的所有知识点完完全全地写出,但发现篇幅会过于冗长而影响阅读。所以准备拆分成几个知识点模块,循序善诱,一步步带领大家弄清楚Android的消息机制

既然没有了篇幅限制,自然可以全面的去讲一讲有关Handler的一切,我先来说说当时是怎么接触到Handler这个类的。

在我自学Android过程中,写了一个访问网络请求图片并显示的Demo,在子线程中我直接给ImageView设置了图片,造成了崩溃。崩溃信息如下:

崩溃信息

Only the original thread that created a view hierarchy can touch its views.

这个错误信息在字面上翻译过来就是:只有创建视图层级的原始线程,有权利处理它的视图。说白了,就是我们经常说的“子线程不能更新UI”。这句话体现了主线程在处理视图上具有唯一权力,这也就是为什么主线程也可以称为UI线程

在解决这个崩溃问题之前,我对Android中子线程不能更新UI产生了非常大的好奇心。

Google如此设计的原因是什么呢?

  1. 表象
    我们先从表象上分析一下,假设可以在子线程更新UI,会产生那些后果呢?
    如果不同的线程控制同一块UI,因为时间的延时性,网络的延迟性,很有可能界面图像会乱套,会花掉。而且出了问题也非常不容易排查问题出在了哪里。从硬件上考虑,每个手机只有一个显示芯片,根本上不可能同时处理多个绘制请求),减少更新线程数,其实是提高了更新效率。
  2. 本质
    如果可以并发的更新UI,事实上是 “is not thread safe”的,也就是线程不安全。我们都知道,线程安全问题其实就是,不同的线程对同一块资源的调用。在更新UI的同时,会涉及context资源的调用,所以产生了线程安全问题。

相关阅读:

你足够了解Context吗?

所以在Android中是不允许在子线程更新UI的、

本文开了一个小头,在下一篇中,将讨论如何解决本文中的崩溃问题。卖个关子,一共有三种方式哦,敬请期待~

更多相关文章

  1. Android(安卓)异步调用,AsyncTask的简单用法
  2. Android进阶(一)-------Android中AsyncTask的简单用法
  3. Android(安卓)版本更新下载自动安装APK,并解决Android6.0安装失败
  4. Android(java)学习笔记134:Handler用法总结和秒表案例
  5. 你真的懂Android(安卓)Handler吗?(二)
  6. Android(安卓)多线程及多线程中更新控件。
  7. Android中的进程间通信(IPC机制)
  8. Android(安卓)Handler机制不一样角度去理解
  9. Android学习记录(4)—在java中学习多线程下载的基本原理和基本用法

随机推荐

  1. Android(安卓)Cloud to Device Messaging
  2. android关于service()
  3. Android(安卓)获取本机安装的应用程序
  4. android brightness control
  5. android图片压缩并转为base64字符串
  6. Appcelerator Cloud Push Notification i
  7. EditText去掉边框和隐藏光标
  8. android中表格绘图
  9. android进度条对话框小例子
  10. Android(安卓)CoordinatorLayout的使用—