The Zen of IntentService. (Andro

作者: Gzw丶南山 | 来源:发表于2017-04-25 16:15 被阅读6次

    上期视频中讲到了线程池的使用场景以及使用中我们应该注意到的一些问题,今天我们来说说 IntentService,视频地址如下(需科学上网):

    https://www.youtube.com/watch?v=9FweabuBi1U

    对于大多数 App 来说,很容易在 UI 线程上处理 services 和 intents。

    但有时候并不总是那么理想,你想让希望该线程可以自由进行渲染。

    在意图服务类的帮助下,我们可以方便的将任务与 UI 线程分离。

    让我们来回顾一下。

    你想要响应一个意图,但你也知道这个任务需要一段时间。

    你不希望那些任务运行在 UI 线程,因为 UI 线程应该忙于渲染工作。

    处理一些任务.png

    解决方式是在主线程接收意图(任务),并在将其发送到其他线程去处理。

    将任务发送到工作线程去处理.png

    我们可以以下的工具类,来完成上面的操作。

    之前介绍过的工具类.png

    例如,当我们任务的结果将要更新 UI 时 AsyncTask 是非常好用的,但是,当你的 App 切换到后台的时候就不是很好用了,这时候没有 UI 为您服务。

    如果你的任务需要时间长时间执行,那么 HandlerThread 是一个不错的选择,但如果一段时间内没有任务了,那么这个线程还在这里并且占用着资源。

    但你还有第三种选择,让你工作变得更简单,IntentService。

    它的核心是,IntentService 是 Service 和 HandlerThread 的混合。

    它继承自 Service 且内部创建了一个新的 HandlerThread,从而去处理那些意图(任务)。

    基本上,它将意图(任务)的响应也移动到了其他线程上去。

    IntentService.png

    因为 IntentService 也是 Service,所以我们也能获得 Service 的一些好处。

    例如,你可以使用 alarms 安排重复任务定期运行,如更新一些社交动态、图片缓存、日志分析等等,当然,这里有几个你需要避免的性能的注意事项。

    第一,HandlerThread 从工作队列中处理任务,这意味着如果某个任务持续很长时间,那么将阻塞工作队列中其他任务的执行。

    多任务.png

    第二,大多数时候当我们在讨论 IntentService 时,人们使用广播去把结果返回给主线程去更新 UI,但其实可能有更好的方法去做这件事,因为通过意图传递消息涉及到内部进程通信,并最终将它带到 Activity 管理器中。

    问题二.png

    所以我们可以使用本地广播管理从而避免上述工作,或者可以在完成任务后使用 runOnUIThread 方法将工作结果返回给主线程。

    使用 runOnUIThread 方法.png

    除了提供了方便的方式在工作完成任务,IntentService 也有益于我们的 App 不那么容易被系统杀死。

    哪种更容易被杀死.jpg

    图中可以的看的出,同时没有前台界面和后台服务的更容易被杀死,但当 IntentService 运行时,它就处在两者之间的状态,被杀的可能性大于有前台界面的,但小于啥都没有的。

    最重要的是不要混淆 IntentService 和其他类型的线程帮助类。

    IntentService 确实很好用,但它并不是通用的线程解决方案,所以这个时候我们需要根据自己的需求来决定使用哪个帮助类更合适。

    这就是关于 IntentService 的这期视频,翻译的不是很好,如果你英语水平还不错,建议你去看看原视频,你会爱上它的。

    相关文章

      网友评论

        本文标题:The Zen of IntentService. (Andro

        本文链接:https://www.haomeiwen.com/subject/xnevzttx.html