打开应用的时候都是创建一个进程,主线程采用死循环保证程序一直执行下去,这种模型是“以事件为驱动”软件系统的必然结果,几乎存在与任何操作系统和编程语言中。ActivityThread主循环的消息来自于当前进程和通过IPC机制投递来过的消息(触摸、按键事件),通过死循环looper.loop一直获取消息,有消息都执行我们生命周期方法或者页面交互,无消息CPU休眠不消耗资源,这都是apk能“动起来”根本原因。这些消息告知主线程要执行onCreate\onStart\onResume等及其如果在执行这些方法时候消耗时间过长会导致ANR或者页面不流畅,所以我们是根据消息来回馈页面交互,从这里可以说明looper的死循环跟主线程卡死不是一回事。

线程与进程之间关系:对于liux来说区别在于是否共享资源,对于CPU来说都是一段可执行的代码,CPU采用CFS调度算法,保证每个task公平享有CPU时间片。

采用死循环:线程都是一段可执行的代码,执行完了后线程的生命周期该终止了,如果要保证一直运行,都要采用死循环。

交互产生:回调onCreate\onStart\onResume等方法操作时间过长导致掉帧发生ANR,looper.loop本身不会导致应用卡死。回调生命周期方法,涉及到ActivityThread里面的ApplicationThread用于接收跨进程系统服务AMS发送过来的事件,然后ApplicationThread使用handler发送消息到主线程管理类ActivityThread执行相应的生命周期。通过发送消息来控制生命周期,所以页面的交互靠底层发送的消息到主线程来进行页面的变化。

消息死循环和消耗:我们先了解下Loop死循环原理,当在MessageQueue没有消息或者有延迟执行的消息时候,便会阻塞在MessageQueue.next方法里的nativePollOnce代码里面。这个时候线程都会释放CPU资源进入休眠状态,直到下一个消息到达或者事务发生,通过往pipe管道写端写数据作唤醒线程工作。这个采用了epoll机制,IO多路复用机制,同时监控多个描述符,有描述符就绪(读写操作),立刻通知相应的用程序进行读写操作,本质IO同步,读写阻塞。

因为死循环时候CPU处于休眠状态,所以并不会耗费大量资源。

android线程卡死,Android主线程为什么不因为Loop死循环卡死相关推荐

  1. 主线程中的Looper.loop()死循环为什么不会导致ANR?

    源码的 ActivityThread 类中执行Looper.loop();的main函数,也就是主线程的入口 public final class ActivityThread {public sta ...

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

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

  3. [Android] 任意时刻从子线程切换到主线程的实现

    [Android] 任意时刻从子线程切换到主线程的实现 - Android移动开发技术文章_手机开发 - 红黑联盟 转载于:https://www.cnblogs.com/melons/p/57919 ...

  4. android线程通信方式,Android 主线程和子线程通信问题

    Android 如今不支持View在子线程中创建及调用其方法.假设要实现子线程内容更新之后.将结果及时反馈到主线程中,该怎样出来呢? 能够在主线程中创建Handler来实现. 这样子线程的结果.能够通 ...

  5. 【Android】子线程切回主线程的方法梳理

    [Android]子线程切回主线程的方法梳理 view.post(Runnable action) textView.post(() -> {textView.setText("更新t ...

  6. [转]Android限制只能在主线程中进行UI访问的实现原理

    目录 Android限制只能在主线程中进行UI访问 Thread的实现 Android Thread 的构造方法 Android Thread 的start()方法 如何在我们自己的代码中去检测当前T ...

  7. 【Android面试】主线程中的Looper.loop()一直无限循环为什么不会造成ANR?

    Android面试中,你也许会被问到题目中的问题,这里我们基于以下几点来延伸解读其中原因: 1.什么是ANR?ANR发生的原因是什么? 2.Looper为什么要无限循环? 3.线程的几种状态 4.主线 ...

  8. 【EventBus】事件通信框架 ( 发送事件 | 判断发布线程是否是主线程 | 子线程切换主线程 | 主线程切换子线程 )

    文章目录 前言 一.根据不同的线程模式进行不同的线程切换操作 二.完整代码示例 前言 发布线程发布事件之后 , 消息中心需要转发这些事件 , 并执行相应的订阅方法 ; 在转发的过程中 , 需要针对订阅 ...

  9. DLL内线程同步主线程研究(子线程代码放到主线程执行)

    DLL内线程同步主线程研究(子线程代码放到主线程执行) 我们在实际项目中经常会用到多线程编程,比如Socket编程等,在创建的线程内同步主线程一般使用Synchronize方法实现子线程操作放到主线程 ...

最新文章

  1. lintcode 滑动窗口的最大值(双端队列)
  2. 服务器的虚拟主机用途,服务器的虚拟主机用途
  3. 多线程创建方式 线程池、Future和CompletableFuture
  4. cad多段线画圆弧方向_CAD箭头怎么画
  5. 在Linux内核使用Kasan
  6. 头条账号权重被降低后会导致点赞推荐兑换率会下降
  7. 删除链表的倒数第 N 个节点
  8. Pandas DataFrame loc []访问一组行和列
  9. poj3349找相同的雪花(哈希)
  10. 关于python循环
  11. Android——控件显示和隐藏
  12. 在Javascript中实现类似C#中string.Format的功能
  13. 纪念硕士论文圆满答辩结束——20180614
  14. 毕设中涉及层次分析法的EXCEL处理步骤
  15. ABP教程-打造一个《电话簿项目》-目录-MPA版本-基于ABP1.13版本
  16. bridge和camera raw
  17. HTML5中定位网页元素重点总结
  18. 真实性能大揭秘 热门移动显卡横向测试
  19. ios 代码例子 卷边的翻书效果
  20. asp实现注册登录界面_asp.net 实现用户登录和注册——基于webform模式

热门文章

  1. 解决python读取pickle报错ValueError: unsupported pickle protocol: 5
  2. 采集浏览器访问某网站时产生的流量,并保存为pcap文件
  3. linux查看后台执行的所有任务与对应的命令
  4. python 二叉树递归时明明已经得到了结果,但是返回None
  5. Linux Shell基础 - Shell 脚本的执行方式
  6. SpringMVC 控制器默认支持GET和POST两种方式
  7. poj1548Robots dfs实践
  8. mysql字符集修改保存_mysql更改已有数据表的字符集,保留原有数据内容
  9. oracle创建自身连接,oracle菜鸟学习之 自连接查询实验
  10. (14)VHDL测试激励编写(时钟)