Android中的线程


MainThread和WorkThread的区别

当在Android系统里启动一个应用程序时,系统会为这个应用程序创建一个线程——主线程main thread(默认情况下,一个进程只有一个主线程),通常也被叫做UI thread,这是因为该线程主要负责处理有关UI的事件,例如用户的按键事件、用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理

由于main thread负责事件的监听和绘图,如果主线程在5秒之内没用响应用户请求,系统就会抛出一个ANR(Application Not Responce)对话框提示用户终止应用程序。为了保证主线程能够随时响应用户的需求来确保良好的用户体验,就不能够在main thread里来处理耗时(会超过5秒)操作了,而是应另起新的线程,将这些耗时操作放到新的线程里来处理。这类线程叫做work thread,也会被叫做子线程。


main thread和conponents的关系

Android的四大组件:Activity、Service、Brocast Receivers以及Content Provider,这四个组件都运行在Main Thread里。例如Activity中,在设备屏幕上点击了一个按钮,设备会把这个动作转换为一个消息message,扔到main thread的消息队列里等候处理。这节需要注意这几个地方:

Service:我们都知道线程用来处理耗时复杂的操作,而service是为运行后台任务而设计的,如果混淆两个概念容易让人产生一个误区:service是一个后台线程。这种认识是错误的,service并不是一个线程!把后台理解为不依赖UI的运行。如果在service里要去执行复杂的任务,同样需要在service里创建一个work thread来处理。否则也会出现ARN message。实现一个service就是要告诉Android System 即使用户不与应用程序交互了(/退出应用程序),线程仍然需要保持运行状态。此外,其他应用程序可以通过intent来启动service,如果后台任务对这两个属性都没有要求的话,就不需要使用service,直接用一个thread就好了。既然service处理耗时复杂操作也要new一个work thread,为什么不直接在Activity里直接创建?这个问题由于和service相关暂时不深入了,直接贴个相关链接Android Service完全解析,关于服务你所需知道的一切(上)以及Android Service全面剖析

Brocast Recivers: Activity中的操作如果耗时超过5秒就会报ANR消息,在BroadcastReceiver中的onReceive()方法如果在10秒内没有执行完,也会报ARN消息。所以使用BroadcastReceiver同样不能做一些比较耗时的操作,如果需要完成一项耗时的工作,可以启动一个service,在service里创建work thread处理耗时任务,再通过handler把消息发布(post)给service。这里又会派生一个问题:为什么不直接在onReceive()里创建线程来解决?

Content Provider:"A content provider is still runs on the main thread,but a call to it is synchronous and does not use message queues."——《Pro Android 4》Chapter17 Exploring Handler.



你可能感兴趣的:(Android中的线程)