Android中为什么主线程更新UI,子线程执行耗时操作?
2017-12-05 15:16
429 查看
Android主线程是线程不安全的?
网上文章常常有说:Android主线程是线程不安全的。我就纳闷了,线程还有安全一说?不能说主线程是线程不安全。线程没有安全不安全这一说。而是更新UI的方法不是线程安全的,即只能在单线程中完成UI的更新,不能使用多线程。(为什么呢?因为子线程可能会有多个,存在多个线程同时操作一个控件的情况,而Andoid UI toolkit并不是线程安全的)因此,只能在主线程中进行UI更新。
Android的单线程模型
Android的单线程模型有两条原则:1.不要阻塞UI线程。
2.不要在UI线程之外访问Android UI toolkit(主要是这两个包中的组件:android.widget and android.view)。
基础环境
在一个Android 程序开始运行的时候,会单独启动一个进程Process。默认的情况下,所有这个程序中的Activity或者Service(Service和Activity只是Android提供的Components中的两种,除此之外还有Content Provider和Broadcast Receiver)都会跑在这个进程空间里。UI线程(主线程)
一个Android 程序默认情况下也只有一个进程Process,但可以有许多个线程Thread。在这么多Thread当中,有一个Thread,我们称之为UI Thread。UI Thread在Android程序运行的时候就被创建,是一个Process当中的主线程Main Thread,主要是负责控制UI界面的显示、更新和控件交互。为什么在主线程更新UI,在子线程执行耗时操作?
在Android程序创建之初,一个Process呈现的是单线程模型,所有的任务都在一个线程中运行。因此,我们认为,UI Thread所执行的每一个函数,所花费的时间都应该是越短越好。如果所有的工作都在UI线程,一些比较耗时的工作比如(访问网络,下载数据,查询数据库等),很容易造成主线程的阻塞,导致事件停止分发(包括绘制事件)。轻则降低用户体验,更坏的情况是,如果主线程被阻塞超过5秒,就会导致ANR,弹出应用程序没有响应,是等待还是关闭的警告。
另外,Andoid UI toolkit并不是线程安全的,所以不能从非UI线程来操纵UI组件。必须把所有的UI操作放在UI线程里。
这也就是这篇博文的答案了。
追及:
Android中子线程真的不能更新UI吗?相关文章推荐
- 主线程不能执行耗时的操作,子线程不能更新Ui
- Thread+Handler异步执行耗时操作更新UI线程界面
- Android拾萃 - RxJava实战(后台执行耗时操作,实时通知 UI 更新)
- android 访问网络不能在主线程中进行以及在线程中操作UI的解决方法
- Android中通过其他线程更新主线程UI
- c#非委托方式在子线程里操作UI控件(实际上运算逻辑在子线程,更新还是在主线程,解决了UI界面无响应的问题)
- android-----在子线程中更新UI操作的方法
- 为什么Android的UI操作是线程不安全的
- android 为什么可以在子线程更新UI
- Android Activity sleep 自线程更新主线程UI
- android为什么不允许新开启一个线程来更新UI,而是用handler来更新界面
- 工作线程(耗时操作)与UI线程实现异步更新
- android线程间通信和主线程更新ui
- android为什么不允许新开启一个线程来更新UI,而是用handler来更新界面
- android为什么不允许新开启一个线程来更新UI,而是用handler来更新界面
- Android中通过其他线程更新主线程UI
- 在Android子线程中初始化handler后,为什么该子线程也能更新UI?
- Android UI 线程执行操作的三种方式
- RxJava2 实战知识梳理(1) - 后台执行耗时操作,实时通知 UI 更新
- Android 子线程操作更新UI方法