首页
学习
活动
专区
圈层
工具
发布
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    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

    91160

    【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.6K20

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

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

    2.2K10

    笔记——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

    45720

    Android Handler机制4之Looper与Handler简介

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

    98830

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

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

    86220

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

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

    1.4K20

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

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

    51560

    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.6K20

    深入探讨Android异步精髓Handler

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

    67720

    通信之线程间通信(上)-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

    65210

    详解 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...以上的这些优先级都是可以在程序中设置的,除此之外还有不可控的优先级均有系统进行自动调整。

    84850

    线程的消息队列是怎么创建的

    上图中我们在子线程中创建一个Handler对象,会抛出异常。异常信息说明不能在没有调用Looper.prepare()的线程中创建Handler对象。 ?...所以在一个线程中创建Handler之前,一定要首先在该线程中调用Looper的prepare函数初始化Looper: ?...在线程中我们是通过调用Looper.prepare()来初始化Looper的,在主线程中我们可以调用Looper.prepareMainLooper()来进行Looper的初始化,而prepareMainLooper...主线程的Looper是不允许退出的,子线程的Looper是允许退出的,另外主线程的Looper是在Activity被创建的时候自动创建,并放置到主线程的ThreadLocal中的,子线程的Looper的创建需要我们自己在子线程中调用...Looper.prepare()来初始化的,而且Looper.prepare()必须在子线程Handler创建之前。

    1.6K20
    领券