Getting a HandlerThread. (Android Performance Patterns Season 5, Ep. 5)

上次视频中着重介绍了 AsyncTask 的使用和应该注意点的三个点,而这次视频中主要介绍了 Handler,视频地址如下:

https://www.youtube.com/watch?v=adPLIAnx9og

下面就开始我们的视频内容学习吧。

我们知道你喜欢使用线程,它确实帮我解决了不少问题,对于 99% 的线程需求,AsyncTask 是正确的解决方案(虽然感觉已经很少人还会用它了)。

但对于一些其它的任务,如果这些任务不需要处理 UI 更新,那么 HandlerThread 是一个非常不错的选择。

你现在有一些任务,你要将它从主线程扔到工作线程上去执行,并在任务结束后将结果拿回到线程进行一些更新操作,这种情况下 AsyncTask 可以解决,因为它里面封装了这些操作,将任务有主线程推到工作线程滨江结果再返回到主线程上。

Getting a HandlerThread. (Android Performance Patterns Season 5, Ep. 5)_第1张图片
AsyncTask

但 AsyncTask 也并不能解决每类问题。

这边有一个例子(视频中的例子我可能翻译不是很好),考虑到从相机获取预览框,这些预览通过 onPreviewFrame() 方法回调给你,并且这个回调在调用打开相功能的线程上被回调。


Getting a HandlerThread. (Android Performance Patterns Season 5, Ep. 5)_第2张图片
Camera Preview

如果这个会调用在主线程上,那么处理回调任务可能会干扰到主线程本应该处理的 UI 渲染或者事件处理。

Getting a HandlerThread. (Android Performance Patterns Season 5, Ep. 5)_第3张图片
回调任务时间很长影响到了主线程工作

如果使用 AsyncTask 也一样,会影响其他 AsyncTask 执行任务(AsyncTask  默认是顺序执行的)。

Getting a HandlerThread. (Android Performance Patterns Season 5, Ep. 5)_第4张图片

如果没有 UI,没有 AsyncTask 线程,那么你可以接收一个长时间运行的任务并接收回调,那么 HandlerThread 是一个不错的选择。

Getting a HandlerThread. (Android Performance Patterns Season 5, Ep. 5)_第5张图片
HandlerThread

HandlerThread 有效的运行着一个长时间活跃的线程,从队列中拿到任务并执行它们,HandlerThread 结合 Android 中一些其他的功能,如 Looper,保持运行的线程,持有消息的队列以及一个 Handler 对象,Handler 对象管理着每个任何插入到消息队列中。

现在看来你可以在 HandlerThread 中打开相机,onPreviewFrame() 会在 HandlerThread 上被回调。

Getting a HandlerThread. (Android Performance Patterns Season 5, Ep. 5)_第6张图片
在 HandlerThread 中进行刚才例子中的操作

所以如果你打算执行一个长时间运行的任务,那么使用 HandlerThread 看来是个不错的选择。

HandlerThread 中的任务想要将结果返回给主线程也是轻而易举的,直接使用 runOnUIThread 命令即可。

所以 HandlerThread 确实在某些场景下使用很有帮助,一个长时间运行且没有 UI 交互的任务,就像在将用户数据上传到服务器前进行的数据压缩。

Getting a HandlerThread. (Android Performance Patterns Season 5, Ep. 5)_第7张图片
上传数据

顺便记住,当你创建 HandlerThread 时,别忘了基于任务类型设置线程的优先级,我是说,记住,CPUs 只能并行处理少量线程工作,所以设置优先级可以帮助系统知道,当其他线程在正确执行的时候任务的正确的执行顺序。

Getting a HandlerThread. (Android Performance Patterns Season 5, Ep. 5)_第8张图片
通过优先级来设置任务的执行顺序

翻译不是很好,我会尽力提升自己的英文水平的。

你可能感兴趣的:(Getting a HandlerThread. (Android Performance Patterns Season 5, Ep. 5))