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,干活儿的线程。

然后是MessageQueueLooper在运行的过程中,会不断从MessageQueue里拉取任务执行。

Handler被用来向工作队列中添加任务

每一个被添加的单元任务(Unit of Work),可以是Intent/runnable/message

这样一整套系统,就构成了Android中很重要的Handler机制。注意到,在Handler之外还有一个Handler Thread,它用来处理Task执行结果。


When An App Starts

当我们的App启动时,系统为它分配了一个单独的进程,并且启动了MainThreadMainThread本质上是一个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获得一些有用的信息。


===Ending===