首页 理论教育 相关概念:程序与系统的管理方式,UI线程的限制

相关概念:程序与系统的管理方式,UI线程的限制

时间:2023-06-17 理论教育 版权反馈
【摘要】:线程是由程序负责管理的,而进程则是由系统进行调度的。最后还有一点就是:Android 4.0后禁止在UI线程中执行网络操作,否则会报:android.os.NetworkOnMainThreadException。

相关概念:程序与系统的管理方式,UI线程的限制

1.什么是线程

应用程序(Application):为了完成特定任务,用某种语言编写的一组指令集合(一组静态代码)。

进程(Process):运行中的程序,系统调度与资源分配的一个独立单位,操作系统会为每个进程分配一段内存空间,程序再依次动态执行,经历“代码加载→执行→执行完毕”的完整过程。

线程(Thread):比进程更小的执行单元,每个进程可能有多条线程,线程需要放在一个进程中才能执行。线程是由程序负责管理的,而进程则是由系统进行调度的。

多线程概念(Multithreading):并行地执行多条指令,将CPU的时间片按照调度算法,分配给各个线程,实际上是分时执行的,只是这个切换的时间很短,给用户造成是同时进行的感觉

举个简单的例子:某用户电脑登录着QQ,突然想听音乐,需要用户把QQ关掉,然后再去启动音乐播放器吗?答案是否定的,实际上用户只需直接打开播放器播放音乐即可,QQ仍可继续运行,这就是简单的多线程。在实际开发中,也有这样的例子,比如某个应用正在运行,发现新版本了,想在后台进行更新,这个时候用户只需开辟出一条后台线程,用于下载新版本的apk,但是这时仍可使用应用中的其他功能,这就是多线程的使用例子。

2.同步与异步的概念

同步:当执行某个功能时,在没有得到结果之前,这个调用就不能返回,即必须等前一件事做完才能做下一件事。

异步:和同步则是相对的,当执行某个功能后,并不需要立即得到结果,就可以正常地做其他操作,这个功能可以在完成后通知或者回调来告诉用户;还是上面那个后台下载的例子,后台下载,用户执行下载功能后,就无需去关心它的下载过程,当下载完成后通知用户即可。(www.xing528.com)

3.Android要引入异步任务的原因

因为Android程序在刚启动时,会同时启动一个对应的主线程(Main Thread),这个主线程主要负责处理与UI相关的事件,有时也称作UI线程。而在运用Android App时必须遵守单线程模型的规则:Android UI操作并不是线程安全的,并且这些操作都需要在UI线程中执行。假如用户在非UI线程中,比如在主线程中new Thread()另外开辟一个线程,然后直接在里面修改UI控件的值;此时会抛出下述异常:

android.view.ViewRoot$CalledFromWrongThreadException:Only the original thread that created a view hierarchy can touch its views

另外,如果用户把耗时的操作都放在UI线程中的话,UI线程超过5 s没有响应用于请求,那么这时会引发ANR(Application Not Responding)异常,即应用无响应。最后还有一点就是:Android 4.0后禁止在UI线程中执行网络操作,否则会报:android.os.NetworkOnMainThreadException。

以上种种原因都说明了Android引入异步任务的意义,当然实现异步也不可以不用到本节讲解的AsyncTask,用户可以自己开辟一个线程,完成相关操作后,通过下述两种方法进行UI更新:

(1)在Handler里写好UI更新,然后通过sendMessage()等的方法通知UI 更新。

(2)利用Activity.runOnUiThread(Runnable)把更新UI的代码创建在Runnable中,更新UI时,把Runnable对象传进来即可。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈