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是两个极其简单但是又非常有用的类。可以减少我们的工作量。
WuRuiF 发布了124 篇原创文章 · 获赞 56 · 访问量 19万+ 私信 关注