ep2讲解了将Thread原型扩展为HandlerThread的原理与实践。
link
大叔的帽衫造型很有范儿啊!!!
Build Worker Thread
一个Thread,从本质上讲,就是完成了一个“接受任务-执行任务-完成任务”的过程
如果我们希望这个Thread可以在它的生命周期内多做一些事,是的,尽可能压榨这个Thread,毕竟我们在前面要创建它,在后面要摧毁它,在这中间要让它物尽其用。
Do Work … Do Work … Do Work …
现在这个Thread已经被成功洗脑,进入了无限Do Work的循环中,就像一头拉磨的毛驴,是时候向磨盘里加上一些谷子了。我们将待处理的工作称为Task,这些Task被组织在一个叫做WorkQueue的队列中。
加谷子的工作,交由另一个Thread进行——把专业的事情交给专业的角色去做。
Android Implementations
了解过上面的基本原理,我们看看Android中是如何实现这一机制的。
首先是Looper
,也就是上文中的Worker Thread
,干活儿的线程。
然后是MessageQueue
,Looper
在运行的过程中,会不断从MessageQueue
里拉取任务执行。
Handler
被用来向工作队列中添加任务
每一个被添加的单元任务(Unit of Work
),可以是Intent/runnable/message
这样一整套系统,就构成了Android中很重要的Handler机制。注意到,在Handler
之外还有一个Handler Thread
,它用来处理Task执行结果。
When An App Starts
当我们的App启动时,系统为它分配了一个单独的进程,并且启动了MainThread
,MainThread
本质上是一个HandlerThread
,它有且只有一个MainLooper
。
MainThread
也是UI Thread
,在它运行过程中几乎会处理一切操作(在ep1中已经提到过)
- 系统消息(翻转手机,界面重新绘制)
- 用户输入(下滑列表)
- 其它应用传过来的信息
要知道,MainThread
一个很重要的任务是负责UI绘制,如果交给MainThread太多的任务,会影响每16ms一次的UI渲染,造成ANR。
Choose Your Tool – No Silver Bullet
- AsyncTask:将任务切换到UI线程/非UI线程
- HandlerThread:当需要Callback时使用
- ThreadPool:执行更细化的单元任务
- IntentService:用以执行后台任务,或将Intent任务从UI线程中提取出来执行
Systrace
Systrace 是SDK提供、用于查看CPU操作耗时的工具,当你在测试应用时发现了丢帧现象,需要深究原因的时候,可以通过Systrace获得一些有用的信息。