Service个人笔记4 --IntentService处理耗时任务

本文章中的代码来自 《疯狂Android讲义》

Service可以后台处理一些简单的任务,但是不建议使用Service处理耗时任务。

原因:
1.Service 不会专门启动一条单独的进程,Service与它所在的应用位于同一个进程中。
(Service开启不会启动新线程)
2.Service 本身也不是一条新的线程(Service本身不是新线程)

对于第一个问题,有两种解决方案

    1.在Service中自己另外启动一个线程来处理耗时任务。(可以实现,但存在线程安全问题)
    2.在 其他的组件中处理耗时任务,不在Service中完成。(有漏洞)

第1中方法,是可以实现但是当多个异步线程执行时,不能保证线程安全。

第2种方法,是存在缺陷的

    比如你将 耗时任务放在Activity或者BroadcastReceiver中 开启一个子线程 处理。
    首先Activity随时会被用户退出,BroadcastReceiver的生命周期也很短。 
    可能出现的问题是: 
                  在耗时任务还没有处理完的时候,Activity,或者BroadcastReceiver已经被销毁了。 此时耗
    时任务所在的子线程的宿主进程就变成了空进程(没有任何活动组件的进程),系统需要内存的时候会优先终止该进程。
    这样就可能导致 任务无法正常完成。
                   每次系统的Broadcast事件发生之后,系统会创建对应的BroadcastReceiver的实例,并自动触   
    发onReceive()方法,onReceiver执行完之后BroadcastReceiver的实例就会被销毁。所以生命周期很短而且如果
    BroadcastReceiver的onReceiver()方法不能在10秒钟内执行完,Android会认为程序无响应(ANR),所以耗时
    任务是不建议放在onReceive()方法中的

所以Android给我们提供了一个新的Service—->IntentService

IntentService将会使用队列来管理请求Intent,每当客户端代码通过Intent请求启动IntentService时,
IntentService会将该Intent加入队列中,然后开启一条新的worker线程来处理Intent。

对于异步的startService()请求,IntentService会按次序的一次处理队列中的Intent,该线程保证同一时刻
只处理一个Intent
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值