每日杂谈Android Performance Patterns 学习记录

Getting a HandlerThread. (Androi

2017-04-16  本文已影响10人  Gzw丶南山

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

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

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

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

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

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

AsyncTask

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

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

Camera Preview

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

回调任务时间很长影响到了主线程工作

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

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

HandlerThread

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

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

在 HandlerThread 中进行刚才例子中的操作

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

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

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

上传数据

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

通过优先级来设置任务的执行顺序

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

上一篇下一篇

猜你喜欢

热点阅读