为什么不能在BroadcastReceiver中开启子线程
当一个广播消息被Receiver监听到时,Android会调用它的onReceive()方法,并将包含消息的 Intent对象传给它处理, onReceive() 方法的执行时间不能超过10 秒,否则会导致ANR。
那么,相信很多人在这里跟我有同样的疑惑:此时直接在Broadcast Receiver中启动子线程来处理耗时任务不行吗?
这种方式不能说不行,只能说不可靠,Receiver只在onReceive方法执行时是激活状态,只要onReceive一返回,Receiver就不再是激活状态了。由于activity可能会被用户退出,Broadcast Receiver的生命周期本身就很短,可能出现的情况是: 在子线程还没有结束的情况下,Activity已经被用户退出了,或者BroadcastReceiver已经结束了。在Activity已经退出、BroadcastReceiver已经结束的情况下,此时它们所在的进程就变成了空进程(没有任何活动组件的进程),系统需要内存时可能会优先终止该进程。如果宿主进程被终止,那么该进程内的所有子线程也会被中止,这样就可能导致子线程无法执行完成.。
这就带来了一个问题:当响应一个广播信息的处理十分耗时的时候,那么就应该把这个处理放在一个单独的线程里去执行,来保证主线程里的其他用户交互组件能够继续运行,而一旦这么做,当onReceive()唤起一个线程后就会马上返 回,这时就会把Receiver进程放到被终止的境地。解决这个问题的方案是在onReceive()里开始一个Service,让这个Service去 做这件事情,那么系统就会认为这个进程里还有活动正在进行。推荐使用IntentService。
为什么不能在BroadcastReceiver中开启子线程相关推荐
- main线程 子线程 顺序_在主线程main中开启子线程thread示例
主线程中开启子线程代码实例: 创建CancleThread类 继承 Thread,对run()方法进行重写代码实例: class CancleThread extends Thread { priva ...
- android 开启子线程方法,android中开启子线程
AndroidRuntime(673): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/ ...
- Android中开启子线程的方法和应用场景
new Thread(){ @Override public void run() { //需要在子线程中处理的逻辑 } }.start(); 创建Thread类对象,在run()方法中进行耗时操作. ...
- node开启子线程_真Node多线程
本文测试使用环境: 系统:macOS Mojave 10.14.2 CPU:4 核 2.3 GHz Node: 10.15.1 从 Node 线程说起 一般人理解 Node 是单线程的,所以 Node ...
- 【Android 异步操作】Android 线程切换 ( 判定当前线程是否是主线程 | 子线程中执行主线程方法 | 主线程中执行子线程方法 )
文章目录 一.判定当前线程是否是主线程 二.子线程中执行主线程方法 三.主线程中执行子线程方法 一.判定当前线程是否是主线程 在 Android 中 , 如果要判定当前线程是否是主线程 , 可以使用如 ...
- 在主线程中为子线程解锁_在XP中为Google Chrome启用Vista黑色风格主题
在主线程中为子线程解锁 If you've seen the screenshots of Google Chrome on XP vs Vista, you've probably noticed ...
- android 开启子线程执行for循环_C++11之多线程 - Part2 Joining和Detaching的使用
std::thread::join()的使用 线程启动后,若想等待该线程结束,可以调用join()方法: std::thread thisThread(function_ptr); // 做一些其他的 ...
- C语言:记录在主线程中停止子线程
主线程中创建一个子线程如代码: #include <stdio.h> #include <pthread.h> #include <unistd.h> #inclu ...
- 安卓开启子线程常用的方法
方法一 构造函数传入Runnable,重写run方法 new Thread(new Runnable() {@Overridepublic void run() {}}).start(); 方法二 T ...
最新文章
- ios传值给js_IOS中plus.ios.implements实现OC方法后,在OC中回调传值后JS端无法正确获取...
- 源码级深挖AQS队列同步器
- C语言判断数组中是否存在该数
- LeetCode 2085. 统计出现过一次的公共字符串(哈希)
- hdu4292Food(最大流Dinic算法)
- Juniper Olive动态路由RIP配置案例
- Git使用手册:HTTPS和SSH方式的区别和使用
- maven伺服搭建_Maven私服搭建
- MySQL Information_Schema表使用注意事项
- java设置窗体图标_在java中怎么设置窗体的图标?详细步骤图解
- ImageAI 学习
- PHP商城网站绑定中国银联在线支付接口
- python数据分析用到的库_用python进行数据分析的五个最常用库
- 微信小程序 环形进度条_微信小程序实现圆形进度条实例分享
- 滴滴开源 LogicFlow:专注流程可视化的前端框架
- 赢在云端:VMware跨云架构,让“云”卷“云”舒自由可控!——访VMware公司大中华区高级技术总监李刚
- 像360悬浮窗那样,用WindowManager做一个炫酷的悬浮迷你音乐盒(上)
- Win10 更新又爆 BUG:删除音频驱动;苹果拒绝法院送达禁令裁定
- python大气校正_Python调用C2RCC实现批量数据的大气校正
- 最完整的WordPress建站教程,新手10分钟学会建站