为什么不建议在广播中启动一个线程做任务
2017-09-19 15:09
295 查看
转:http://blog.csdn.net/kingyc123456789/article/details/53818606
首先需要知道:
1,这里所说的广播是静态广播
2,广播是运行在ui线程,阻塞15s会ANR
3,当android程序第一次运行时会启动一个进程和一个ui线程(不考虑多进程,多线程等)
一个未运行的程序接受到一个广播后的流程:
1,启动程序进程
2,启动ui线程和调用广播的 onReceive(Context context, Intent intent)方法
3,onReceive方法返回后,进程和线程处于等待状态;系统任意时刻可以终止和回收该线程和进程占有资源(内存)
如果:在onReceive开启一个线程做任务,任务未做完系统有可能回收进程,做任务的线程就没有对应的进程上下文,会被回收,任务就有可能未完成。
所以建议在onReceive中启动一个服务(再在服务中开线程做任务)做长时间任务。这样程序进程为后台进程(没有使用startForeground)系统就不会任意时刻回收此进程
首先需要知道:
1,这里所说的广播是静态广播
2,广播是运行在ui线程,阻塞15s会ANR
3,当android程序第一次运行时会启动一个进程和一个ui线程(不考虑多进程,多线程等)
一个未运行的程序接受到一个广播后的流程:
1,启动程序进程
2,启动ui线程和调用广播的 onReceive(Context context, Intent intent)方法
3,onReceive方法返回后,进程和线程处于等待状态;系统任意时刻可以终止和回收该线程和进程占有资源(内存)
如果:在onReceive开启一个线程做任务,任务未做完系统有可能回收进程,做任务的线程就没有对应的进程上下文,会被回收,任务就有可能未完成。
所以建议在onReceive中启动一个服务(再在服务中开线程做任务)做长时间任务。这样程序进程为后台进程(没有使用startForeground)系统就不会任意时刻回收此进程
相关文章推荐
- 为什么不建议在广播中启动一个线程做任务
- 为什么不能直接在BroadCastReceiver中开一个线程执行耗时任务
- 启动一个线程是用run()还是start()? 为什么?
- 启动一个线程是用run()还是start()? 为什么?
- 启动一个线程是用run()还是start()? 为什么?
- 启动一个异步线程去执行一个任务
- hive中的bucket table (输入文件是一个的话,map任务只能启动一个 ,给力啊)
- java如何实现启动一个线程
- 编写高质量代码改善C#程序的157个建议——建议75:警惕线程不会立即启动
- C++多线程框架(一)--------- new一下就启动一个线程
- Web应用启动时,后台自动启动一个线程
- .net C#线程连接Join的技巧,如何真正让一个线程结束,另外一个线程启动
- android为什么不允许新开启一个线程来更新UI,而是用handler来更新界面
- 启动一个线程的三种方法
- JavaWeb 服务启动时,在后台启动加载一个线程
- VC启动一个新线程的三种方法
- 随着tomcat一起启动一个线程
- Timer启动一个定时任务
- Web应用启动时,后台自动启动一个线程
- 线程启动一个不带参数的方法