Android UI主线程与单线程模型

 1.Activity的主线程会在哪个生命周期执行完,子线程会在哪个结束?子线程需要在相应的生命周期前主动结束。
 2.Android ActivityThread(主线程或UI线程)或Thread子线程?
-- ANR 
1.Activity输入事件(按键和触摸事件)5s内没被处理: Input event dispatching timed out
2.BroadcastReceiver的事件(onRecieve方法)在规定时间内没处理完(前台广播为10s,后台广播为60s)
3.service 前台20s后台200s未完成启动 Timeout executing service
4.ContentProvider的publish在10s内没进行完:timeout publishing content providers
  如果在UI主线程中执行过多耗时任务,在activity/service中耗时操作超过5秒,或者在BroadcastReceiver中超过10s,就会出现ANR(Android Not Responsing)无响应异常?

-- Android应用各种类型的线程本质上基于linux系统的pthreads,在应用层可以分为三种类型线程。
  1.主线程:主线程也称为UI线程,随着应用启动而启动,主线程用来运行Android组件,同时刷新屏幕上的UI元素。Android系统如果检测到非主线程更新UI组件,那么就会抛出CalledFromWrongThreadException异常,只有主线程才能操作UI,是因为Android的UI工具包不是线程安全的。主线程中创建的Handler会顺序执行接受到的消息,包括从其他线程发送的消息。因此,如果消息队列中前面的消息没有很快执行完,那么它可能会阻塞队列中的其他消息的及时处理。
  2.Binder线程:Binder线程用于不通过进程之间线程的通信,每个进程都维护了一个线程池,用来处理其他进程中线程发送的消息,这些进程包括系统服务、Intents、ContentProviders和Service等。在大部分情况下,应用不需要关心Binder线程,因为系统会优先将请求转换为使用主线程。一个典型的需要使用Binder线程的场景是应用提供一个给其他进程通过AIDL接口绑定的Service。
  3.后台线程:在应用中显式创建的线程都是后台线程,也就是当刚创建出来时,这些线程的执行体是空的,需要手动添加任务。在Linux系统层面,主线程和后台线程是一样的。在Android框架中,通过WindowManager赋予了主线程只能处理UI更新以及后台线程不能直接操作UI的限制。

> UI线程,单线程模型
  ActivityThread功能:它管理应用进程的主线程的执行(相当于普通Java程序的main入口函数),并根据AMS的要求(通过IApplicationThread接口,AMS为Client,ActivityThread、ApplicationThread为Server)负责调度和执行activities、broadcasts和其它操作。

Android中多线程的使用四种方式最全总结- https://mp.weixin.qq.com/s?
__biz=MzI0MjE3OTYwMg==&mid=2649549195&idx=1&sn=41a1ac9f44e6a6550778e953cbc6f1fe&chksm=f11802f6c66f8be02f7ef79bfd902775e32a4ed8ec2f68365919a691d2a34e0dcaa41ddaf8b3#rd?ref=myread
-- 哪些是在UI线程中执行:
(1)在没有调用子线程Looper而创建的Handler的对象mHandler,mHandler.post()和mHandler.handleMessage()方法是运行在UI线程中的。 
(2)AsyncTask类中,除了doInBackground()方法在子线程中运行,其他都在UI线程中执行。 
(3)View.post()方法也是在UI线程中执行的 
(4)activity的所有生命周期 
(5)Service和BroadcastReceiver的onReceiver()方法

为什么Activity生命周期函数是运行在UI线程,Activity的生命周期函数是怎样运行在主线程的?- http://blog.csdn.net/xxxzhi/article/details/52246152
Android单线程模型说明- http://blog.csdn.net/bestone0213/article/details/41175303
-- Android进程(单线程)模型,单线程模型:
 当一个程序第一次启动时,Android会同时启动一个对应的 主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事 件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线 程。在开发Android应用时必须遵守单线程模型的原则:Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。 UI操作,如UI刷新.
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值