Android中的UI线程详解

本文详细介绍了Android的UI线程,包括UI线程的作用、ANR产生的原因及如何解决在worker线程中访问UI资源的问题。讨论了Handler和AsyncTask在更新UI中的应用,提供了解决ANR问题的策略。
摘要由CSDN通过智能技术生成

(一)什么是UI线程?

  Android在启动应用程序的时候,会为应用创建一个Main线程,这个线程负责将事件分派给相应用户接口的widget,其中包括drawing事件。除了事件分派之外,Main线程还负责应用与Android UI组件(例如, android.widget 和android.view 包)进行交互,因此Main 线程有时候也被称为UI线程。

(二)为什么会出现ANR(Application Not Response)?

  Android不会为每个组件实例创建单独的线程。运行于同一进程的所有组件均在 UI 线程(Main)中实例化,并且对每个组件的系统调用均由该线程进行分派。这样一来,响应系统回调的方法(例如,报告用户操作的 onKeyDown() 或生命周期回调方法)始终在进程的 UI 线程中运行。举个例子来说,当用户触摸屏幕上的按钮时,应用的 UI 线程会将触摸事件分派给Widget,而Widget反过来又设置其按下状态,并将无效请求发布到事件队列中。UI 线程从队列中取消该请求并通知Widget进行重新绘制。
  那么,如果应用在响应用户的操作的时候,在UI线程中执行了大量的耗时操作,比方说网络访问或数据库查询。这样做的后果势必会阻塞整个 UI。一旦UI线程被阻塞,将无法分派任何事件,包括绘图事件。
  如果 UI 线程被阻塞超过几秒钟时间(目前大约是 5 秒钟),就会出现我们常说的ANR。

(三)解决在worker线程中访问UI资源的问题?

  你可能会想,既然ANR是由于在UI线程中执行大量耗时的操作引起的,那么我们在主线程中新建一个worker线程问题不就解决了么?事实上,这种方式的确能够解决一些问题,但是对于UI来说就不是那么灵光了。不要忘了,Android UI toolkit并不是线程安全的,这也就意味着你不能在worker线程中来管理UI,也就是我们平常所说的不能在线程中更新UI。
  至此,我们其实可以总结出两条适用于Android单线程模型的规则:

  • 不要阻塞UI线程;
  • 不要在UI线程之外访问Androd UI toolkit。

  针对不能再线程中更新UI的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值