首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深入Handler、Looper、MessageQueue

Handler、Looper、MessageQueue基本了解可以看下这篇文章 Android源码解读-Handler、Loop、MessageQueue 一、MessageQueue如何实现Message...二、Looper.loop是一个死循环,拿不到需要处理的Message就会阻塞,那在UI线程中为什么不会导致ANR?...如果当前Looper不阻塞,执行完成,那app直接嗝屁。 2.阻塞后为什么还能跳转页面等操作 这个问题是2个问题。第一个是如何执行页面跳转等操作,第二个是阻塞后为什么还能操作页面。...我们可以看到ActivityThread定义了内部类Handler,他和Looper都是在同一线程即主线程。...Handler可以接受来自binder线程的数据,比如收到msg=H.LAUNCH_ACTIVITY,添加到MessageQueue中,Looper监测有数据了,通过Handler,把消息发出去,最终则调用

36520
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Looper,MassageQuene,Handler

    theme: fancy 数量关系 Looper.prepare()将Looper存储到ThreadLocal中,保证一个线程只有一个Looper,MessageQuene又是在Looper的构造方法中进行的初始化...所以一个线程一个Looper一个MessageQuene多个Handler 主线程和子线程使用区别 主线程为什么不用进行Looper.prepare()和Looper.loop()方法的调用就可以使用Hnadler...app入口类ActivityThread的main()中就已经调用了Looper.prepareMainLooper()和Looper.loop()两个方法。...所以主线程也要调用只不过ActivityThread帮你做了 大概流程 Looper中for(;;)死循环调用MessageQuene的next()方法(该方法也为for(;;)死循环)取出最新消息。...其实只是Java层的Mq没有消息,Native里面也有Mq和Looper,例如接收底层点击事件通过单独的一个InputQuene队列,Native层的消息处理是比Java的优先级高的,所以Java发送Message

    40720

    Android Looper,Handler,Message,MessageQueue介绍

    每个应用在启动的时候会自动创建一个Looper,每个线程只能有一个Looper,因为这个是一个线程私有变量。下面是Looper成员的关系图。...类图 可以发现Fwk和Native都有一套Looper,而包含关系正好相反,Fwk层是Looper包含MessageQueue,而Native是MessageQueue包含Looper,Fwk的具体实现是完全由...这儿调用了Looper.prepareMainLooper(),这个就是为主线程生成默认的Looper,如果普通线程需要使用Handler就需要自己手动创建Looper了。...对于普通线程,Looper就可以是允许退出的了,这块可以通过prepare的参数来控制。那如何拿到主线程Looper呢?...void Looper::setForThread(const sp& looper) { sp old = getForThread(); // also has

    83820

    Android Handler与Looper原理浅析

    Looper运行模型.jpg APP端UI线程都是Looper线程,每个Looper线程中维护一个消息队列,其他线程比如Binder线程或者自定义线程,都能通过Handler对象向Handler所依附消息队列线程发送消息...Looper对象,Looper.prepare只能调用一次,再次调用会抛出异常。...其实prepare的作用就是新建一个Looper对象,而在new Looper对象的时候,会创建关键的消息队列对象: private Looper(boolean quitAllowed) {...RuntimeException("No Looper; Looper.prepare() wasn't called on this thread."); }...Looper Java层与native层关系7.0.jpg 在更早的Android版本中,同步逻辑是利用管道通信实现的,不过思想是一致的,看一下4.3的代码 Looper::Looper(bool allowNonCallbacks

    1.1K40

    深入Android Handler,MessageQueue与Looper关系

    而MessageQueue是由Looper负责管理的,也就是说,如果希望Handler正常工作的话,就必须在当前线程中有一个Looper对象。那么又该如何保障当前线程中一定有Looper对象呢?...(new Looper(quitAllowed)); } 在创建Looper对象前先会去判断ThreadLocal中是否已经存在Looper对象,如果不存在就新创建一个Looper对象并且存放ThreadLocal...()方法内部源码我们可以知道,首先会通过myLoooper()去获取一个Looper对象,如果Looper对象为null,就会报出一个我们非常熟悉的错误提示,“No Looper;Looper.prepare...mainHandler = new Handler() 等价于 new Handler(Looper.myLooper())Looper.myLooper():获取当前进程的looper对象, Looper.getMainLooper...() 原因是非主线程中默认没有创建Looper对象,需要先调用Looper.prepare()启用Looper,然后再调用Looper.loop()。

    83631

    【Android】Handler 机制 ( Handler | Message | Looper | MessageQueue )

    四组件对应关系 : Handler 机制中的上述四者的对应关系 : 一个线程中只能有一个 LooperLooper 中封装的 MessageQueue , 每个 Looper 可以为多个 Handler...Looper 内部 , 每个 Looper 中只定义了一个 MessageQueue ( 消息队列 ) , 因此每个线程也只能有一个 MessageQueue ; 线程 与 Looper ( 消息遍历者...() 方法 , 将线程转为 Looper 线程 , 因为 创建 Handler 时 , 会关联线程的 Looper 对象 , 普通的子线程是没有 Looper 对象的 , 调用 Looper.prepare...Looper 线程 : 如果要将 Handler , Looper 机制引入到线程中 , 使某线程具有接收 Message ( 消息 ) , 执行某项操作的功能 , 需要将该线程转为 Looper 线程...将线程转为 Looper 线程 //主要是创建 Looper 放入 ThreadLocal 对象中 Looper.prepare(); //3.

    1.4K20
    领券