-
线程处理的辅助类
-
AsyncTask 类
-
HandlerThread 类
-
ThreadPoolExecutor 类
善于在 Android 上利用线程可以帮助您提升应用的性能。本页从以下几个方面讨论线程的使用:使用界面线程(即主线程);应用生命周期与线程优先级之间的关系;以及平台为帮助管理线程复杂性所提供的方法。对于每个方面,本文都介绍了潜在的陷阱和相应的规避策略。
主线程
当用户启动您的应用时,Android 会创建新的 Linux 进程以及执行线程。这个主线程也称为界面线程,负责屏幕上发生的一切活动。了解其工作原理有助于您通过设计让应用利用主线程实现最佳性能。
内部原理
主线程的设计非常简单:它的唯一工作就是从线程安全工作队列获取工作块并执行,直到应用被终止。框架会从多个位置生成部分工作块。这些位置包括与生命周期信息、用户事件(例如输入)或来自其他应用和进程的事件相关的回调。此外,应用也可以不使用框架而自行对块进行明确排队。
应用执行的任何代码块
几乎都与事件回调(例如输入、布局扩充或绘制)相关联。当某个操作触发事件时,发生了事件的线程会将事件从线程本身里推送到主线程的消息队列中。然后,主线程可以为事件提供服务。
当有动画或屏幕更新正在进行时,系统会每隔 16ms 左右尝试执行一个工作块(负责绘制屏幕),从而以每秒 60 帧
的流畅速度进行渲染。要使系统达到此目标,界面/视图层次结构必须在主线程上更新。但是,如果主线程的消息队列中的任务太多或太长,导致主线程无法足够快地完成更新,那么应用应将此工作移至工作线程。如果主线程无法在 16ms 内执行完工作块,则用户可能会察觉到卡顿、延迟或界面对输入无响应。 如果主线程阻塞大约 5 秒,系统会显示“应用无响应”
(ANR) 对话框,允许用户直接关闭应用。
将大量或冗长的任务从主线程中移出,使其不影响流畅渲染和快速响应用户输入,这是您在应用中采用线程处理的最大原因。
线程和界面对象引用
根据设计,Android 视图对象不是线程安全的
。无论是创建、使用还是销毁界面对象,应用都应在主线程上完成。如果