首页
学习
活动
专区
工具
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,把消息发出去,最终则调用

34920

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

39120

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

81420

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()。

79831

【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

Looper.loop()引发的惨案 - 掘金

终于,凶手露出了水面,凶手就是Looper,原来妹子是通过OkHttp的拦截器来监听账号被挤,并通过Looper来弹出一个Toast提示,并且执行页面跳转逻辑,如下: public class TokenInterceptor...开始破案 Looper一脸委屈的说道:你说我是凶手,我就是凶手了,证据呢?...没有消息的时候,可见,调用Looper.loop()方法所在的线程会进入死循环。 那这个和我们的案件有什么关系呢?...注意注意,前方高能预警 用简单的话来说,该线程池,同一时间,仅会执行一个任务,也就是串行,这也就解释Looper与本案的关系,因为Looper.loop()所在线程进入死循环,该线程所在线程池收到其它任务时...最后,提醒大家,一定要慎用Looper,不是任何时候都适合用Looper的,像妹子遇到的这种场景,完全可以用主线程的Handler post一个消息出去,然后处理业务,亦或者通过EventBus、LiveData

39060
领券