IntentService的实际应用场景

    IntentService相比父类Service而言,最大特点是其回调函数onHandleIntent中可以直接进行耗时操作,不必再开线程。其原理是IntentService的成员变量 Handler在初始化时已属于工作线程,之后handleMessage,包括onHandleIntent等函数都运行在工作线程中。

    如果对IntentService的了解仅限于此,会有种IntentService很鸡肋的观点,因为在Service中开线程进行耗时操作也不麻烦。我当初也是这个观点,所以很少用IntentService。

    但是IntentService还有一个特点,就是多次调用onHandleIntent函数(也就是有多个耗时任务要执行),多个耗时任务会按顺序依次执行。原理是其内置的Handler关联了任务队列,Handler通过looper取任务执行是顺序执行的。

    这个特点就能解决多个耗时任务需要顺序依次执行的问题。而如果仅用service,开多个线程去执行耗时操作,就很难管理。

    例如在之前做的app中,有一个需求是下载某段时间用户保存的图片,下载完成后显示在imageView中;一般需要下载的图片有很多,每下一个图片就是一个线程,下载完后立即显示出来,所以肯定希望下载是按顺序依次下载,这样用户体验就比较好。当时的处理方式欠妥,直接开多个线程去下载,在前一个图片下载完成之前,其他线程必须等待;这样虽然也可以实现功能,但效率上不高,甚至可能出现ANR(具体代码逻辑是,如果后面的线程获得了cpu,而前面的图片还没下完,则等待;假设前一张图片没下完,而后面的线程一直获得cpu,就有问题)。

    如果这个场景使用IntentService就非常方便,每个耗时任务都按顺序依次执行,不必担心出现逻辑上或性能上的问题,也是IntentService的价值所在。


总结:Android中很多类都是为某些常用场景所设计,例如本文中的IntentService以及之前写过的handlerThread等类,平时多积累,在以后遇到一些棘手问题时才能迎刃而解。

发布了11 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zhengyin_tmac/article/details/52446696