为什么不能直接在BroadCastReceiver中开一个线程执行耗时任务
2017-06-05 12:35
666 查看
BroadCastReceiver的生命周期非常简短:接收到广播→onReceive()→结束;
所以在onReceive方法中,不要执行耗时的任务,如果该方法执行时间超过10秒,Android就会认为该程序无响应,并弹出ANR的对话框。如果必须执行耗时任务可以考虑,在onReceive中开启服务来执行,但不要使用线程,因为BroadCastReceiver的生命周期很短,可能出现子线程还没有结束,BroadCastReceiver就已经退出了。
如果当BroadCastReceiver所在的进程结束,虽然该进程中可能有用户启动的新线程,但是由于该进程内没有活动的组件,系统会在内存紧张的时候,优先结束掉该进程,这就会导致BroadCastReceiver启动的子线程不能执行完。
转载地址
所以在onReceive方法中,不要执行耗时的任务,如果该方法执行时间超过10秒,Android就会认为该程序无响应,并弹出ANR的对话框。如果必须执行耗时任务可以考虑,在onReceive中开启服务来执行,但不要使用线程,因为BroadCastReceiver的生命周期很短,可能出现子线程还没有结束,BroadCastReceiver就已经退出了。
如果当BroadCastReceiver所在的进程结束,虽然该进程中可能有用户启动的新线程,但是由于该进程内没有活动的组件,系统会在内存紧张的时候,优先结束掉该进程,这就会导致BroadCastReceiver启动的子线程不能执行完。
转载地址
相关文章推荐
- android 直接在activity/broadcast receiver中启动子线程来处理长时间的耗时任务不行吗?
- Activity、BroadcastReceiver、Service,只要是有长时间处理的任务,就需要重新开一个线程?!
- 调用线程对象的start()方法会执行run(),为什么不能直接调用run()方法??
- 为什么不建议在广播中启动一个线程做任务
- 关于AsyncTask的一个小疑问:为什么任务执行有延迟?
- 高并发,执行耗时短的任务,还有低并发,执行耗时长的任务,各自选取什么样的线程池比较合理?为什么?如果业务场景是高并发,且任务耗时长时,有什么解决思路?
- ThreadPoolTaskExecutor 多线程分解执行耗时任务与单线程串行执行简单比较
- android中network的连接不能在直接在主线程中执行
- 多线程用同一个dao对象就会存在多个线程执行同一方法,为什么不用考虑线程安全问题
- 一个线程执行多个任务,要按照顺序执行
- 如何在 BroadcastReceiver 中执行耗时操作?
- 线程系列02,多个线程同时处理一个耗时较长的任务以节省时间
- 为什么说invalidate()不能直接在线程中调用
- JDK中的Timer和TimerTask详解 目录结构: Timer和TimerTask 一个Timer调度的例子 如何终止Timer线程 关于cancle方式终止线程 反复执行一个任务 sche
- Android中为什么主线程更新UI,子线程执行耗时操作?
- 为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?
- ThreadPoolTaskExecutor 多线程分解执行耗时任务与单线程串行执行简单比较
- 利用IntentService实现在broadcastreceiver中比较耗时的任务
- 一个主线程下有多个子线程任务,主线程必须在100秒内将子线程执行的集合结果进行处理返回
- 为什么说invalidate()不能直接在线程中调用