您的位置:首页 > 产品设计 > UI/UE

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吗?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: