为什么不建议在广播中启动一个线程做任务
2016-12-22 18:50
239 查看
首先需要知道:
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)系统就不会任意时刻回收此进程
相关文章推荐
- 为什么不建议在广播中启动一个线程做任务
- 启动一个线程是用run()还是start()? 为什么?
- 为什么不能直接在BroadCastReceiver中开一个线程执行耗时任务
- 启动一个线程是用run()还是start()? 为什么?
- 启动一个线程是用run()还是start()? 为什么?
- 启动一个异步线程去执行一个任务
- VC6中,为什么只有类中的static成员函数,才可以做为线程启动函数(ThreadProc)?
- 怎样使用mock object测试一个启动新线程的类
- 一个定时完成任务的类(使用线程)
- 怎样使用mock object测试一个启动新线程的类
- 如何在一个进程中启动另外一个线程:ProcessStartInfo Constructor
- linux内核启动(2)——2.2.创建和中止任务与内核线程
- 1126 新启动一个线程搜索资源
- .net C#线程连接Join的技巧,如何真正让一个线程结束,另外一个线程启动
- 在cron启动定时任务后总是会启动一个[sendmail] 进程的解决方法, 并且每次cron任务之后msmtp.log总是记录一条发送失败的日志
- c# 关于启动一个等待MASK窗体盖住主窗体,任务完成后,关掉MASK窗体的总结
- 另开了一个线程,线程里面一个函数调用UpdateData(false),结果就出错,为什么?
- Shark编程实例:启动一个流程,获得所有任务的列表,完成一个任务
- C#创建一个线程为什么会消耗那么多的内存?
- 一个JVM进程启动后里面有几个线程