之前面BAT时被问过两三次的问题,为什么喜欢问这个?因为这里能延伸出去很多问题,想答好并不简单。
首先会问
IntentService跟Service有什么区别?
Service运行在主线程中,直接使用做耗时任务会卡主线程,从而导致ANR。Service ANR的时间为前台Service20秒,后台Service200秒。
而IntentService会开启子线程,重写onHandleIntent方法中处理逻辑即可,不会引发ANR。
如果高级岗位只回答到这里,那么结果大概率是
接着应该要回答
IntentService实现原理是什么?
IntentService整个类不到一百行代码,那就先把核心源码抬上来看看
核心原理就是用了HandlerThread+Handler,handler绑定的是HandlerThread的子线程looper mServiceLooper,onStart时sendMessage调用onHandleIntent执行重写的逻辑。
那么这时候肯定需要回答一下
HandlerThread是什么,怎么实现的?
HandlerThread顾名思义就是Handler和Thread,其内部也是这样的,HandlerThread 继承Thread, run方法中prepare子线程的looper,存在mLooper中,方便外面获取。
所以HandlerThread比较适合用来做串行任务。
上图中我用箭头标注的地方是用了synchronize进行同步了,就延伸出一个问题,如果这个答上来,就可以判断出是看过这块的源码
HandlerThread中的synchronized作用是什么?
先看第二个箭头,getLooper方法会被外界所调用来获取当前线程的looper(可以看回IntentService的onCreate里面),然后进入同步代码块,如果mLooper为空会wait()阻塞等待,目的是等待mLooper赋值,mLooper的赋值是在第一个箭头那里,赋值之后notifyAll唤醒,然后返回已赋值的mLooper。
如果答上来这里,又可以继续问synchronized与lock的区别?实现原理?又或者问synchronized有几种锁类型?膨胀过程了解吗?可以发散开很多问题,单纯synchronized的内容就可以单独开一篇讲了。
温馨提示
IntentService新版本SDK被标记废弃,新版本让考虑使用workmanager或者JobIntentService,但,不妨碍学习里面的知识点。
总结一下
IntentService(Service+HandlerThread+Handler)
HandlerThread(extends Thread+handler+prepare looper)
构建自己的知识体系很重要,《那你讲一下》系列就是希望把这一些知识点尽量的串起来,能更好的帮助理解和关联记忆,而不是单纯分享某一个零散的知识点,其实就是我自己平时的笔记整理,希望大家可以喜欢这个系列,可以多多点赞吧。