IntentService与HandlerThread的工作原理(个人笔记)

IntentService

IntentService是Service的一个子类,为Android开发者提供了一个方便的在工作线程中执行的Service。

为什么需要IntentService

1.Service的缺陷。 android的Service默认在主线程中执行,但是Service的初衷是在后台执行耗时操作,但是主线程中执行耗时操作会使界面卡顿,所以这是一个悖论,我们开发者只能自己去创建工作线程执行任务,但是如果自己创建了工作线程就得自己去管理,所以凭空产生了很多问题。耗费开发者精力
2. 改进方法。这样Android就为我们封装了一个在工作线程中执行的Service,方便我们使用。我们只需要在onHandleIntent的回调中执行耗时操作就可以了。

IntentService如何实现

实现的基本思路:封装一个在工作线程中执行的Handler。一切以源码来分析

1.需要的重要基本组件。

一个在工作线程中执行的Handler
在这里插入图片描述
2.切换线程

在onStartCommand中将intent通过handler发送到子线程处理。
在这里插入图片描述

其实大体思路很简单,就这样就可以完成IntentService的主要框架了。我们查看源码也可以发现,IntentService对于Service的封装也只是有区区的几百行代码。但是这里面有几个细节需要注意

  • Handler怎么切换到工作线程的?
    首要要明确一个事情,平时我们使用的无参构造Handler默认是取当前线程的Looper来使用,一般我们是在主线程中new Handler以达到在子线程中切换到主线程。但是这次是我们需要在主线程中切换到子线程。所以我们需要使用有参构造的Handler来指定工作线程的Looper。而这是一个比较麻烦的过程,我们既需要自己创建工作线程,还需要自己创建Looper并且管理启动与退出。所以Android也为我们封装了方便的类叫HandlerThread(后面会再说明一下)。在IntentService中就使用了这个类

在这里插入图片描述

  • 从源码看出了什么?

我们看到了,这其实是一个很简易的过程,无论是从思路和代码实现上。但是我们也发现了,对IntentService的每一次启动,都会进入handler事件队列,所以我们不用担心多线程造成的事件序列混乱。而且每一次处理完事件都会自己调用stopSelf来销毁Serivce,所以也无需管理Service的生命周期。

在这里插入图片描述

HandlerThread是什么?

1.是一个Thread的子类。
HandlerThread是一个Thread的直接子类。说明它的主要功能就是作为一个线程存在,一个工作线程。
在这里插入图片描述

2.封装了Looper
它的作用就是方便为工作线程创建handler所需要的looper环境。所以它需要创建Looper,开启Looper,退出Looper。除此之外,无其他特殊功能。
在这里插入图片描述
获取Looper方法。
在这里插入图片描述
退出Looper方法
在这里插入图片描述

总结

IntentService与HandlerThread是两个极其简单但是又非常有用的类。可以减少我们的工作量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值