瞎扯

昨天写了bus的生产者与消费者. 今天就写写looper 为什么不和handler一起写呢?因为懒.

Looper

loop翻译一下,回路,循环

大致就是循环的意思.

android里也一样.一个可以无限的死循环

其实大部分人应该都知道looper是个循环,不断的取消息,然后调用handler处理.

启动过程:

翻一下Handler的源码 构造函数.里的一段

   mLooper = Looper.myLooper();if (mLooper == null) {throw new RuntimeException("Can't create handler inside thread " + Thread.currentThread()+ " that has not called Looper.prepare()");}
复制代码

handler必须持有一个Looper对象

Looper对象怎么来?

    private static void prepare(boolean quitAllowed) {if (sThreadLocal.get() != null) {throw new RuntimeException("Only one Looper may be created per thread");}sThreadLocal.set(new Looper(quitAllowed));}/*** Return the Looper object associated with the current thread.  Returns* null if the calling thread is not associated with a Looper.*/public static @Nullable Looper myLooper() {return sThreadLocal.get();}
复制代码

Looper.prepare() 应该很熟悉吧.

再来一段代码,子线程中创建Handler:

public void test() {new Thread(){@Overridepublic void run() {super.run();Looper.prepare();Handler handler = new Handler();Looper.loop();}}.start();}
复制代码

经历不深的人,看着这一段,肯定是懵的. 为什么调下Looper.prepare()就行了.怎么跟handler联系上的. 调Looper.loop();的干嘛?

Looper怎么跟handerl关联上的.明天再写.哈哈 今天就写为什么要调Looper.loop();

写份伪代码你应该就明白了.

public void test2() {new Thread() {@Overridepublic void run() {super.run();Looper looper = new Looper();//创建Looper,Handler handler = new Handler(looper);//handler绑定looperlooper.loop();//looper开启循环}}.start();}public class Looper {public Looper prepare() {return new Looper();}public void loop() {for (; ; ) {
//              msg.target.dispatchMessage(msg);handler.dispatchMessage(msg);//死循环,调用handler的回调处理结果.}}}
复制代码

去掉那些复杂的代码. 其本质差不多就这样,略过了MessageQueue. MessageQueue就是个有序队列,其实没啥好讲的.一个集合而已.

looper.loop();为什么要在线程的最后调用?

因为死循环啊...不在最后调用在哪调用. 还有为了让这个线程不结束啊. 不信可以试试在loop()后面再写代码.你看会不会往下走- -

把方法里的内容展开一下

  new Thread() {@Overridepublic void run() {super.run();Looper looper = new Looper();Handler handler = new Handler(looper);for (; ; ) {
//              msg.target.dispatchMessage(msg);handler.dispatchMessage(msg);}//如果不手动调用,looper怎么工作呢, 并且保证执行在线程的最后面- -//可以试试,不调用loop(), handler会不会的回调会不会走.}}.start();
复制代码

看看ams中如何创建的主线程的handler,looper

这个ServiceThread是什么鬼

是不是我前面说的那么回事.哈哈

总结:

AMS,启动了主线程. 然后我们写的所有activity,fragment之类的代码,什么onCreate,onStart里的代码. 其实都相当于,执行在Looper.loop()里面.通过handler发送消息.处理消息在不停的调用.方法调方法这样不停的.如果你不停的debug下一行,就会发现跑到Looper里面去了.就是这个道理. 所以,当我们某个UI更新操作逻辑过于复杂,就会出现卡死的情况. onstart,onparse等生命周期里面逻辑太复杂也会造成ANR.因为主线程走不下去了.肯定没法响应.

主线程的Looper退出循环,意味着,主线程结束,程序退出.

交流群:493180098,这是个很少吹水,交流学习的群.

转载于:https://juejin.im/post/5cdb70def265da037516c4de

Android-Looper是个什么东西相关推荐

  1. 【转】Android -- Looper.prepare()和Looper.loop()

    Looper.prepare()和Looper.loop() 原文地址:http://blog.csdn.net/heng615975867/article/details/9194219 Andro ...

  2. Android -- Looper.prepare()和Looper.loop() —深度版

    Android中的Looper类,是用来封装消息循环和消息队列的一个类,用于在android线程中进行消息处理.handler事实上能够看做是一个工具类.用来向消息队列中插入消息的. (1) Loop ...

  3. Android开发该学习哪些东西?

    开篇: 本人也是众多Android开发道路上行走的一员,听了不少大神的知乎live,自己也看了不少书,也和不少前辈交流过,所以在这里分享一下Android开发应该学习的书籍以及知识,当然,也包括一些方 ...

  4. Android开发者该学习哪些东西提高竞争力?成功入职腾讯

    写在前面 记得我大二时"不务正业"地自学Android并跟了老师做项目,到大三开始在目前的公司实习,至今毕业已有几年多,学习Android已经6.7年多了!但总感觉知识点很零散,并 ...

  5. Android Looper

    (1) Looper类别用来为一个线程开启一个消息循环.默认情况下Android中新诞生的线程是没有开启消息循环的.(主线程除外,主线程系统会自动为其创建Looper对象,开启消息循环) Looper ...

  6. 2020年了,Android开发者应该会哪些东西才不会被公司淘汰?

    面向Android初.中级开发者,对于要学习的Android理论知识,我认为主要包括: Android基础 & 常用 Android进阶 与时俱进.热门技术 编程语言 计算机基础 下面,我将对 ...

  7. android bea拷贝,从Android开发中学到一些东西

    本人从事java服务器端开发已经有6,7年了,最近这一年多转去做Android开发.到今天觉得应该把自己的一些感受写下来,供以后参考. 1. Java bean的定义 我们一般定义一个java bea ...

  8. android sdk广告是什么东西,Android广告SDK的Package

    adware adware是指广告类的恶意软件. 大部分adware都是基于广告库SDK写成的.所以我们可以通过检测广告库SDK来检测adware. APK SDK package SDK很难检测,但 ...

  9. 红米android system干什么的,Android System Webview是什么东西

    这是安卓系统内置webkit内核浏览器的一个组件,组件名称为Webview. WebView是安卓系统中一款基于webkit引擎.展现web页面的控件. Android的Webview在低版本和高版本 ...

  10. Android Looper用法及分析

    先看一下源码中对looper进行的解释, 根据注释内容,可以了解到,消息循环的交互情况都是通过handler进行的. 再不和handler搭配的情况下,通常都是以looper.prepare和loop ...

最新文章

  1. ML顶会论文都可复现吗?来挑战一下,还能拿500美元补贴
  2. 杭电1421java实现
  3. L1-013. 计算阶乘和
  4. evplayer2可以多设备登录吗_这么多自助设备,你都选对投放位置了吗
  5. 一文弄懂AOP各种概念
  6. Python学习笔记-包
  7. SQLSERVER之快速掌握T-SQL语句
  8. 查看局域网内所有用户
  9. vue高德地图H5定位及城市选择器控件实现详细教程
  10. Network 之五 TCP/IP 协议族、工作流程、(TCP、IP、MAC、VLAN)常用协议格式详解
  11. 人工智能相关专利分析: 会比其他常见的计算机软硬件领域更难申请吗?
  12. 2017开发者技术和薪酬调查报告
  13. 银行储蓄系统 类图 顺序图 E_R图 功能结构图 数据流图 系统流图 逻辑结构设计 关系模式 数据关系表
  14. java-net-php-python-jspm库存管理系统计算机毕业设计程序
  15. 如果微软狠心鸿蒙系统,微软强制用户升级华为鸿蒙系统出来你会放弃windows使用鸿蒙吗...
  16. iframe内嵌标签
  17. java只获取当前小时分钟_【转】java获取当前年、月、日 、小时 、分钟、 秒、 毫秒...
  18. 介绍8421码,5421码,2421码
  19. Windows10 2004五月更新正式版官方ISO纯净版镜像下载
  20. 华科大考研计算机系834大纲之数据结构(六)

热门文章

  1. 计算机是根据易经发明的,不懂历史和易经的人总是自欺欺人的说洋鬼子根据易经发明了计算机...
  2. 中国行政区编码_邮政编码_区号编码
  3. ss使用ipv6地址
  4. Cilium网络概述
  5. javaMail 收取邮件,邮件获取,并保存附件
  6. 诫子书--与同仁共勉
  7. window.scrollTo、scrollTop
  8. 云学习1 | 云计算与云服务类型了解
  9. 外卖跑腿app为什么这么火爆?前景怎么样?
  10. android view上下滚动条,Android自定义View六(ViewGroup水平垂直滚动实现类似支付宝年度账单的效果)...