当一个广播消息被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中开启子线程相关推荐

  1. main线程 子线程 顺序_在主线程main中开启子线程thread示例

    主线程中开启子线程代码实例: 创建CancleThread类 继承 Thread,对run()方法进行重写代码实例: class CancleThread extends Thread { priva ...

  2. android 开启子线程方法,android中开启子线程

    AndroidRuntime(673): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/ ...

  3. Android中开启子线程的方法和应用场景

    new Thread(){ @Override public void run() { //需要在子线程中处理的逻辑 } }.start(); 创建Thread类对象,在run()方法中进行耗时操作. ...

  4. node开启子线程_真Node多线程

    本文测试使用环境: 系统:macOS Mojave 10.14.2 CPU:4 核 2.3 GHz Node: 10.15.1 从 Node 线程说起 一般人理解 Node 是单线程的,所以 Node ...

  5. 【Android 异步操作】Android 线程切换 ( 判定当前线程是否是主线程 | 子线程中执行主线程方法 | 主线程中执行子线程方法 )

    文章目录 一.判定当前线程是否是主线程 二.子线程中执行主线程方法 三.主线程中执行子线程方法 一.判定当前线程是否是主线程 在 Android 中 , 如果要判定当前线程是否是主线程 , 可以使用如 ...

  6. 在主线程中为子线程解锁_在XP中为Google Chrome启用Vista黑色风格主题

    在主线程中为子线程解锁 If you've seen the screenshots of Google Chrome on XP vs Vista, you've probably noticed ...

  7. android 开启子线程执行for循环_C++11之多线程 - Part2 Joining和Detaching的使用

    std::thread::join()的使用 线程启动后,若想等待该线程结束,可以调用join()方法: std::thread thisThread(function_ptr); // 做一些其他的 ...

  8. C语言:记录在主线程中停止子线程

    主线程中创建一个子线程如代码: #include <stdio.h> #include <pthread.h> #include <unistd.h> #inclu ...

  9. 安卓开启子线程常用的方法

    方法一 构造函数传入Runnable,重写run方法 new Thread(new Runnable() {@Overridepublic void run() {}}).start(); 方法二 T ...

最新文章

  1. ios传值给js_IOS中plus.ios.implements实现OC方法后,在OC中回调传值后JS端无法正确获取...
  2. 源码级深挖AQS队列同步器
  3. C语言判断数组中是否存在该数
  4. LeetCode 2085. 统计出现过一次的公共字符串(哈希)
  5. hdu4292Food(最大流Dinic算法)
  6. Juniper Olive动态路由RIP配置案例
  7. Git使用手册:HTTPS和SSH方式的区别和使用
  8. maven伺服搭建_Maven私服搭建
  9. MySQL Information_Schema表使用注意事项
  10. java设置窗体图标_在java中怎么设置窗体的图标?详细步骤图解
  11. ImageAI 学习
  12. PHP商城网站绑定中国银联在线支付接口
  13. python数据分析用到的库_用python进行数据分析的五个最常用库
  14. 微信小程序 环形进度条_微信小程序实现圆形进度条实例分享
  15. 滴滴开源 LogicFlow:专注流程可视化的前端框架
  16. 赢在云端:VMware跨云架构,让“云”卷“云”舒自由可控!——访VMware公司大中华区高级技术总监李刚
  17. 像360悬浮窗那样,用WindowManager做一个炫酷的悬浮迷你音乐盒(上)
  18. Win10 更新又爆 BUG:删除音频驱动;苹果拒绝法院送达禁令裁定
  19. python大气校正_Python调用C2RCC实现批量数据的大气校正
  20. 最完整的WordPress建站教程,新手10分钟学会建站

热门文章

  1. 微型计算机基础学的什么,微型计算机操作基础课的教学
  2. JavaWeb实现打印
  3. 解决Windows环境下PHP连接MySQL很慢的问题
  4. L1-007 念数字 (10分)
  5. A股上市公司财报披露时间
  6. Linux系统中如何创建NFS共享目录
  7. uniapp项目中引用iconfont图标,实现信号强度图标展示(离线使用)
  8. 智慧交通大数据可视化,让城市运营车辆可视、可监、可控
  9. 细节:如何轻松影响他人
  10. DSF(Debugger Services Framework) service介绍