首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

Android异步消息处理机制完全解析,带你从源码角度彻底理解

确实,不过即使只是简单new一下,还是有不少地方需要注意,我们尝试程序创建两个Handler对象,一个线程创建,一个线程创建,代码如下所示: public class MainActivity...,你会发现,线程创建Handler是会导致程序崩溃,提示错误信息为 Can't create handler inside thread that has not called Looper.prepare...说是不能在没有调用Looper.prepare() 线程创建Handler,那我们尝试线程中先调用一下Looper.prepare()呢,代码如下所示: new Thread(new Runnable...这样基本就将Handler创建过程完全搞明白了,总结一下就是线程中可以直接创建Handler对象,而在子线程中需要先调用Looper.prepare()才能创建Handler对象。...这是由于Handler总是依附于创建时所在线程,比如我们Handler是线程创建,而在子线程中又无法直接对UI进行操作,于是我们就通过一系列发送消息、入队、出队等环节,最后调用到了Handler

74560

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

Handler 创建 : 这里注意 只能在 Looper 线程创建 Handler , 普通线程不能创建 Handler ; ① 主线程 : 主线程中可以直接创建 Handler , 因为点击应用图标后就会...Looper.loop(); ... }//main ... }//ActivityThread ② 子线程 : 子线程如果要创建 Handler , 需要先 调用 Looper.prepare...() 方法 , 将线程转为 Looper 线程 , 因为 创建 Handler 时 , 会关联线程 Looper 对象 , 普通线程是没有 Looper 对象 , 调用 Looper.prepare...Looper.prepare() 静态方法 , 该方法作用是创建 Looper 变量 , 存储了 ThreadLocal 中 , 将当前普通线程转为 Looper 线程 ; ③ 实例化 Handler...成员 : 一定要在 Looper.prepare() 之后实例化成员 , 因为如果在之前实例化 , Handler 与 Looper 无法产生关联 ; ④ 轮询消息队列 : 调用 Looper.loop

1.4K20

深入Android Handler,MessageQueue与Looper关系

程序创建Looper对象时,会在它构造方法中创建MessageQueue对象。...Handler:它作用有两个—发送消息和处理消息,程序使用Handler发送消息,由Handler发送消息必须被送到指定MessageQueue;否则消息就没有MessageQueue进行保存了...我们在前面说过Handler作用有两个—发送消息和处理消息,我们使用Handler发送消息,由Handler发送消息必须被送到指定MessageQueue;否则就无法进行消息循环。...而 我们Handler是线程创建,也就是说Looper也是主线程Looper,因此handleMessage内部处理最终都会在主线程上执行,就这样整个流程都执行完了。...() 原因是非主线程中默认没有创建Looper对象,需要先调用Looper.prepare()启用Looper,然后再调用Looper.loop()。

79931

Android :安卓学习笔记之 Handler机制 简单理解和使用

// 即 :若线程中无创建Looper对象,则也无法创建Handler对象 // 故 若需线程创建Handler对象,则需先创建Looper对象...*/ // Android应用进程启动时,会默认创建1个主线程(ActivityThread,也叫UI线程) // 创建时,会自动调用ActivityThread1个静态main...()方法 = 应用程序入口 // main()则会调用Looper.prepareMainLooper()为主线程生成1个Looper对象 /** * 源码分析...自动开启 消息循环 ->>下面将详细分析 } 总结: 1、创建线程时,会自动调用ActivityThread1个静态main();而main()则会调用Looper.prepareMainLooper...()创建 线程若不手动创建Looper对象 则无法生成Handler对象 2、根据Handler作用(线程更新UI),故Handler实例创建场景 主要在主线程 3、生成Looper &

38010

笔记——Android零碎知识摘录(一)

虽然说加了这个属性,能使其他程序不能调用。但是,需要注意是,如果两个程序userid是一样的话,exported=”false“就没有用了。...java反射.png 4、并发与并行是基于硬件而言。 并发,指的是多个事情,同一时间段同时发生了。...Looper.prepare()->new Handler()->sendMessage()->MessageQueue->Looper.loop()->handlerMessage(),但是UI线程是主线程中...,系统会自动调用Looper.prepareMainLooper()方法创建线程Looper(Looper.prepare()与Looper.loop())和消息队列MessageQueue。...prepare()调用sThreadLocal.set(new Looper(quitAllowed)),至于Looper,它在Android消息机制中担负着消息轮询职责,它会不间断地查看MessageQueue

38620

Android异步通信:深入剖析Handler机制源码

// 即 :若线程中无创建Looper对象,则也无法创建Handler对象 // 故 若需线程创建Handler对象,则需先创建Looper对象...*/ // Android应用进程启动时,会默认创建1个主线程(ActivityThread,也叫UI线程) // 创建时,会自动调用ActivityThread1个静态main()方法...= 应用程序入口 // main()则会调用Looper.prepareMainLooper()为主线程生成1个Looper对象 /** * 源码分析:main()...自动开启 消息循环 ->>下面将详细分析 } 总结: 创建线程时,会自动调用ActivityThread1个静态main();而main()则会调用Looper.prepareMainLooper...()创建 线程若不手动创建Looper对象 则无法生成Handler对象 根据Handler作用(线程更新UI),故Handler实例创建场景 主要在主线程 生成Looper & MessageQueue

62420

Android Handler异步通信:深入详解Handler机制源码

Handler 机制简介 定义 一套 Android 消息传递机制 作用 线程应用场景中,将工作线程中需更新UI操作信息 传递到 UI主线程,从而实现 工作线程对UI更新处理,最终实现异步消息处理...// 即 :若线程中无创建Looper对象,则也无法创建Handler对象 // 故 若需线程创建Handler对象,则需先创建Looper对象...()方法 = 应用程序入口 // main()则会调用Looper.prepareMainLooper()为主线程生成1个Looper对象 /** * 源码分析...自动开启 消息循环 ->>下面将详细分析 } 总结: 创建线程时,会自动调用ActivityThread1个静态main();而main()则会调用Looper.prepareMainLooper...()创建 线程若不手动创建Looper对象 则无法生成Handler对象 根据Handler作用(线程更新UI),故Handler实例创建场景 主要在主线程 生成Looper & MessageQueue

1.2K20

Android Handler机制4之Looper与Handler简介

简单翻一下: Handler是一个可以通过关联一个消息队列来发送和处理消息,发送或处理Runnable对象一个处理程序,每个Handler都关联一个单个线程和消息队列,当你创建一个新Handler...即当一个进程被应用程序创建时,它线程会运行一个消息队列负责管理它创建高层应用程序对象(如Activity、Broadcast Receiver等)和任何它窗口创建对象,你可以通过一个Handler...默认线程没有与它们相关联消息喜欢;所以要在运行循环线程调用prepare(),然后调用loop()让它循环处理消息,直到循环停止。...并且标记为一个程序主Looper。由Android环境来创建应用程序主Looper。因此这个方法不能由咱们来调用。...所以同一个线程里面(已经调用Looper.prepare()),Handler里面的MessageQueue和LooperMessageQueue指向了同一个对象。

86530

面试官还问Handler?那我要给你讲个故事

那子线程怎么创建Handler呢?只需new Handler()之前调用Looper.prepare()即可。 2. 为什么主线程可以直接new Handler?...子线程直接new Handler会报错,主线程为什么就不会报错呢?主线程我也没有调用Looper.prepare()啊?那么我们还得看下源码了。...Looper.prepareMainLooper(); ... } //看到这一下就明白了,原来主线程启动时候默认就调用了prepareMainLooper(),而在这个方法中调用了...大致意思就说 “由于这个处理程序被声明为一个内部类,它可以防止外部类被垃圾回收。如果处理程序正在对主线程以外线程使用Looper或MessageQueue,则不存在问题。...如果处理程序正在使用主线程Looper或MessageQueue,则需要修复处理程序声明,如下所示:将处理程序声明为静态类;并且通过WeakReference引用外部类”。

41560

Handler消息传递机制

上面的Handler是线程创建,当我们线程创建一个Handler时,运行程序会报错: java.lang.RuntimeException: Can't create handler inside...只有创建或获取新消息时才会清除该标志,因为这是允许应用程序修改消息内容唯一时间。...一个线程默认是没有消息循环,如果要创建一个,需要在线程调用Looper.prepare,然后调用Looper.loop使其处理消息,知道循环结束。 基本上是和Handler交互处理消息循环。...回到最开始例子,Handler使用步骤如下: 在线程A创建Handler,重载handleMessage方法处理消息 在线程B使用Handler.sendMessage等发送消息 消息从线程B发到线程...线程创建uiHandler,此时这个Handler属于UIThread,其内部Looper也是UIThread创建,MQ也UIThread(Looper持有)。

2.3K20

深入探讨Android异步精髓Handler

众所周知,AndroidUI是在其主线程中进行刷新,所以Google建议开发人员切勿线程中进行耗时操作否则很容易导致应用程序无响应(ANR)。...这句话意思是:如果在线程创建handler必须调用Looper.prepare()。...调用prepare()方法后需要调用loop()方法开始消息轮询,并且需要时候调用quit()方法停止消息轮询 假若再次执行Looper.prepare()系统发现sThreadLocal.get...这是因为UI线程是主线程,系统会自动调用Looper.prepareMainLooper()方法创建线程Looper和消息队列MessageQueue Message发送和处理过程 讨论完Looper...该示例中handler是线程创建,所以它当然会在主线程处理消息;如此以来该Runnable亦会在主线程中执行;所以,Runnablerun()方法中执行耗时操作是不可取容易导致应用程序无响应

55320

通信之线程间通信(上)-handler

当你应用程序正在进行处理消息操作时,应用程序线程会专门用来运行一个消息队列来管理顶级应用程序对象(activities,broadcastreceivers,等等)以及任何他们创建窗口。...三:Looper: Looper用来为一个线程循环消息message.线程默认是没有消息循环;可以调用Looper.prepare()方法创建一个message loop,loop停止之前可以用它来处理...Chapter Four,源码研究 明白了是什么和怎么做之后,接下里看一看源码解释,为什么要用Looper.prepare创建looper和messagequeue实例,以及looper.loop...Looper.prepare调用了Looper私有静态方法prepare(boolean) //quitallowed故名思义是说调用quit时是否允许退出 private static void...总结一下就是 调用Looper.prepare创建looper和messagequeue对象 handler通过调用post将runnable发送给messagequeue,或者通过调用sendMessage

52210

详解 Android 中 HandlerThread

HandlerThread是Android API提供一个便捷类,使用它我们可以快速创建一个带有Looper线程,有了Looper这个线程,我们又可以生成Handler,那么HandlerThread...实现原理 介绍原理之前,我们先使用普通Thread来创建一个Handler,创建过程大致如下: 1 2 3 4 5 6 7 8 9 10 11 12 Handler mHandler; private...mHandler = new Handler(Looper.myLooper()); Looper.loop(); } }.start(); } 实现很简单,目标线程如下配置...调用Looper.prepare 创建与当前线程绑定Looper实例 使用上面创建Looper生成Handler实例 调用Looper.loop()实现消息循环 明白上面的实现步骤,HandlerThread...以上这些优先级都是可以程序中设置,除此之外还有不可控优先级均有系统进行自动调整。

70750
领券