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

Android开发之Handler的前世今生

当您创建一个新的处理程序时,它绑定到正在创建它的线程线程/消息队列 - 从那时起,它将向消息队列传递消息和可运行文件,并在消息发出时执行它们 队列。...Handler有两个主要用途:(1)可预见的时间内去调度消息和作为一些点的可运行程序(2)将不同于自己的线程执行的操作排入队列。...后台版本允许你将接收到的消息队列调用的Runnable对象排入队列; sendMessage版本允许你将包含将由处理程序handleMessage(Message)方法处理的数据包(要求您实现Handler...当为你的应用创建一个进程时,其主线程专用于运行一个消息队列,该消息队列负责管理顶级应用程序对象(activitys, broadcast receivers 等)及其创建的任何窗口。...我们handler时,都是handleMessage方法处理消息的,那么我们就从handleMessage方法入手: ?

38610

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

开始进入正题,我们都知道,Android UI线程不安全的,如果在子线程尝试进行UI操作,程序就有可能会崩溃。...确实,不过即使只是简单new一下,还是有不少地方需要注意的,我们尝试程序创建两个Handler对象,一个线程创建,一个线程创建,代码如下所示: public class MainActivity...这是由于Handler总是依附于创建时所在的线程,比如我们的Handler是线程创建的,而在子线程又无法直接对UI进行操作,于是我们就通过一系列的发送消息、入队、出队等环节,最后调用到了Handler...的handleMessage()方法,这时的handleMessage()方法已经是线程运行的,因而我们当然可以在这里进行UI操作了。...通过以上所有源码的分析,我们已经发现了,不管是使用哪种方法线程更新UI,其实背后的原理都是相同的,必须都要借助异步消息处理的机制来实现,而我们又已经将这个机制的流程完全搞明白了,真是一件一本万利的事情啊

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

HandlerThread详解「建议收藏」

HandlerThread是如何做到一个线程能够一直运行,有新的任务就处理,没有任务就等待?...(Message msg) { super.handleMessage(msg); //这个方法是运行在 handler-thread 线程的...避免线程同步问题导致Looper为null getLooper()调用时,可能run()方法Looper还没有创建成功,此时返回Looper会出现问题。因此需要去wait。...run()Looper一旦创建好,就可以去notifyAll()让getLooper()可以返回正确的Looper 6、为什么要设置线程优先级?为什么能防止内存泄漏和解决数据安全问题?...线程优先级主要分为UI线程后台线程(backgorund) 线程默认优先级为default,也就是UI线程,会和UI线程去平等的争抢资源。 UI性能要求较高的场景下,应该使用后台线程

63720

android 线程那点事

线程既要处理Activity组件的UI事件,又要处理Service后台服务工作,通常会忙不过来。为了解决此问题,主线程可以创建多个子线程处理后台服务工作,而本身专心处理UI画面的事件。...为什么会出现ANR Android希望UI线程能根据用户的要求做出快速响应,如果UI线程花太多时间处理后台的工作,当UI事件发生时,让用户等待时间超过5秒而未处理,Android系统就会给用户显示ANR...接着UI线程调用Looper.loop()方法进入消息循环体,进入后就会不断地从消息队列读取并处理消息。...除此以外还有Java的守护线程和垃圾回收线程堆裁剪守护进程等在运行。 ? Paste_Image.png 程序自定义Thread和UI线程的区别是什么?...子线程为什么不能更新UI 因为UI访问是没有加锁的,多个线程访问UI是不安全的,如果有多个子线程都去更新UI,会导致界面不断改变而混乱不堪。

74550

面试Handler都没答上来,你真的了解Handler吗?Handler全面解析来了!

说白了,其实死循环也是有意为之,线程可执行代码执行完后,就会终止,而主线程肯定需要一直运行,所以死循环就能保证这一点。 「死循环之外怎么处理事务?」...既然主线程是死循环,那么如果有其他事务该怎么处理呢?创建线程呗,线程创建之前会创建一些其他的binder线程,比如ApplicationThraed。...「死循环是不是会浪费cpu资源」 主线程的messageQueue没有消息的时候,会阻塞在loop的queue.next方法,此时主线程会释放CPU资源,进入休眠状态,直到下个消息来到,所以不会一直消耗...监听主线程UI操作已完成。既然都执行到我这里来了,就说明UI操作都完成了是吧。 「面试题5:同步屏障机制是什么,有什么呢?」...可以统一管理后台任务,运行在前台,所以可以获取到上下文。 而IntentService同样具有这些特性,并且可以线程管理任务,工作执行完自动销毁。

1.2K00

Android面试之高级篇

Looper也把消息队列里的消息广播给所有的 Handler:Handler接受到消息后调用handleMessage进行处理 Message:消息的类型,Handler类handleMessage...方法得到单个的消息进行处理 线程模型下,为了线程通信问题,Android设计了一个Message Queue(消息队列), 线程间可以通过该Message Queue并结合Handler和Looper...Message     Message消息,理解为线程间交流的信息,处理数据后台线程需要更新UI,则发送Message内含一些数据给UI线程。 2....Looper.loop()方法运行开始后,循环地按照接收顺序取出Message Queue里面的非NULL的Message。     2....为什么要使用convertView? 当convertView为空时,setTag()方法为每个View绑定一个存放控件的ViewHolder对象。

1.3K90

面试必考体系庞大的Handler你真的都了解吗?Handler二十七问带你打破砂锅问到底!

Message消息被分发之后会怎么处理?消息怎么复用的? Looper是干嘛呢?怎么获取当前线程的Looper?为什么不直接Map存储线程和对象呢? ThreadL ocal运行机制?...可以多次创建L ooper吗? Looper的quitAllowed字段是啥?有什么? Looperloop方法是死循环为什么不会卡死(ANR) ?...子线程,如果消息都处理完了,就需要调用quit方法停止消息循环。 Looper.loop方法是死循环为什么不会卡死(ANR)?...(为什么线程不需要单独创建Looper) 主要做了两件事: 1、main方法创建了主线程的Looper和MessageQueue,并且调用loop方法开启了主线程的消息循环。...主线程崩溃,其实都是发生在消息的处理内,包括生命周期、界面绘制。 所以如果我们能控制这个过程,并且发生崩溃后重新开启消息循环,那么主线程就能继续运行

52030

Android编程实现异步消息处理机制的几种方法总结

二、为什么使用Handler Android设计之时,就封装了一套消息的创建、传递、处理机制,作为系统原生的异步消息处理机制的实现之一,我们需要遵循这样的处理机制,该机制的另外一种实现是AsyncTask...四、为什么Android只能通过Handler机制线程更新UI?...使用Handler机制,我们不用去考虑多线程的问题,所有更新UI的操作,都是线程消息队列轮询去处理的。...异步消息处理线程启动后会进入一个无限的循环体之中,每循环一次,从其内部的消息队列取出一个消息,然后回调相应的消息处理函数,执行完成一个消息后则继续循环。若消息队列为空,线程则会阻塞等待。...4、扩展 其实Handler不仅可以更新UI,你完全可以一个子线程中去创建一个Handler,然后使用这个handler实例在任何其他线程中发送消息,最终处理消息的代码都会在你创建Handler实例的线程运行

60441

Android精通之Handler讲解

Handler的方法以及使用 1.Handler.sendMessage() 2.Handler.post() 二:onCreate为主线程/UI线程,做一些轻量级的事情 主线程: //创建一个Handler...(msg); /* * 接到子线程发出来的消息,处理 * */ //处理消息 Log.i(TAG,"handleMessage:" + msg.what);...: 处理Message与线程关联的Runnable对象MessageQueue,第一,安排将要执行的消息和可执行的程序;二,不用的线程执行任务。...//Looper.loop(); 了解一下Looper Looper为线程运行消息循环的类。...线程默认情况下没有与它们相关的消息循环;创建一个,在要运行循环线程调用prepare(),然后让loop()处理,直到循环停止。 与消息循环的大多数交互是通过Handler类。

44020

Android异步消息处理机制完全解析-Handler详解

而我们一般View都是为了显式UI上的。Android正是为了防止我们UI线程去操作这些UI上的控件,才加了限制的。...二、为什么要使用Handler Android设计的时候,就封装了一套消息创建、传递、处理机制,如果不遵循这样的机制就没有办法更新UI信息,就会抛出异常。 三、Handler怎么呢?...六、自定义一个与线程相关的Handler 1、线程创建一个Looper 可以使用 Looper.prepare();方法 2、实例化一个Handler 3、调用Looper.loop();方法循环处理消息...那为什么直接在Activity的onCreate添加子线程可以直接更新UI呢?...详细解答: 为什么我们可以UI线程更新UI 八、Handler异步消息处理(HandlerThread) Android HandlerThread 完全解析 Android异步消息处理机制完全解析

83530

Android消息处理机制

Google参考了Windows的消息处理机制,Android系统实现了一套类似的消息处理机制。学习Android的消息处理机制,有几个概念(类)必须了解: 1....Message 消息,理解为线程间通讯的数据单元。例如后台线程处理数据完毕后需要更新UI,则可发送一条包含更新信息的Message给UI线程。 2....图1 类关联关系图 运行机理: 每个线程都可以并仅可以拥有一个Looper实例,消息队列MessageQueueLooper的构造函数中被创建并且作为成员变量被保存,也就是说MessageQueue...而在子线程,Looper需要通过显式调用Looper. Prepare()方法进行创建。...Looper,这里mMainHandler将绑定主线程的Looper * * 线程不用显式调用Looper.prepare()创建Looper * */ mMainHandler

38530

android线程间通信的几种方法_Android进程间和线程间通信方式

线程自己基本上不拥有系统资源,只拥有一些在运行必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。...区别: (1)、一个程序至少有一个进程,一个进程至少有一个线程; (2)、线程的划分尺度小于进程,使得多线程程序的并发性高; (3)、进程执行过程拥有独立的内存单元,而多个线程共享内存,但线程之间没有单独的地址空间...双方Messenger来发送数据,Handler来处理数据。Messenger处理数据依靠Handler,所以是串行的,也就是说,Handler接到多个message时,就要排队依次处理。...机制 AsyncTask,异步任务,也就是说UI线程运行的时候,可以在后台的执行一些异步的操作;AsyncTask可以很容易且正确地使用UI线程,AsyncTask允许进行后台操作,并在不显示使用工作线程或...使用Handler的主要作用就是在后面的过程中发送和处理Message对象和让其他的线程完成某一个动作(如在工作线程通过Handler对象发送一个Message对象,让UI线程进行UI的更新,然后UI

1.1K10

Handler源码和9个常见问题的解答,这些你都掌握了吗?

Handler是Android的消息处理机制,是一种线程间通信的解决方案,同时你也可以理解为它天然的为我们线程创建一个队列,队列的消息顺序就是我们设置的延迟的时间,如果你想在Android实现一个队列的功能...子线程的如何更新UI,比如Dialog,Toast等?系统为什么不建议子线程更新UI? 主线程如何访问网络? 如何处理Handler使用不当造成的内存泄漏?...看完上面的代码可能你会有一个疑问,线程更新UI(进行Toast)不会有问题吗,我们Android不是不允许线程更新UI吗,实际上并不是这样的,ViewRootImpl的checkThread...系统为什么不建议线程访问UI? 这是因为 Android 的UI控件不是线程安全的,如果在多线程并发访问可能会导致UI控件处于不可预期的状态,那么为什么系统不对UI控件的访问加上锁机制呢?...Android是基于消息处理机制的,用户的行为都在这个Looper循环中,我们休眠时点击屏幕,便唤醒主线程继续进行工作。 主线程的死循环一直运行是不是特别消耗 CPU 资源呢?

1.2K00

深入Android Handler,MessageQueue与Looper关系

程序创建Looper对象时,会在它的构造方法创建MessageQueue对象。...这里其实分两种情况: (1)UI线程,系统已经初始化好了一个Looper对象,因此我们可以直接创建Handler并使用即可。...(2)线程,我们就必须自己手动去创建一个Looper对象,并且去启动它,才可以使用Handler进行消息发送与处理。...而 我们的Handler是线程创建的,也就是说Looper也是主线程的Looper,因此handleMessage内部处理最终都会在主线程上执行,就这样整个流程都执行完了。...最后我们来个小总结:Android的Looper类主要作用是来封装消息循环和消息队列的,用于android线程中进行消息处理。handler是用来向消息队列插入消息的并最好对消息进行处理

77831

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

对于主线程而言,创建线程ActivityThread时会先将looper准备好,所以线程可以直接使用handler。...当你的应用程序正在进行处理消息的操作时,应用程序线程会专门用来运行一个消息队列来管理顶级的应用程序对象(activities,broadcastreceivers,等等)以及任何他们创建的窗口。...三:Looper: Looper用来为一个线程循环消息message.线程默认是没有消息循环的;可以调用Looper.prepare()方法创建一个message loop,loop停止之前可以用它来处理...第一种情况,使用主线程的handler进行message的send和process 只有主线程才能去更新UI线程,如果程序开启了子线程,而又想去更新UI,这时候就要借助Handler将消息传给主线程...,进行刷新UI,简单的总结一下handler的用法 1,activity创建handler,更新UI的操作在此进行: private Handler mHandler = new Handler()

50210

想实现安卓队列功能?Handler内功心法,你值得拥有!——Handler源码和常见问题的解答

image.png Handler是Android的消息处理机制,是一种线程间通信的解决方案,同时你也可以理解为它天然的为我们线程创建一个队列,队列的消息顺序就是我们设置的延迟的时间,如果你想在...子线程的如何更新UI,比如Dialog,Toast等?系统为什么不建议子线程更新UI? 主线程如何访问网络? 如何处理Handler使用不当造成的内存泄漏?...看完上面的代码可能你会有一个疑问,线程更新UI(进行Toast)不会有问题吗,我们Android不是不允许线程更新UI吗,实际上并不是这样的,ViewRootImpl的checkThread...系统为什么不建议线程访问UI? 这是因为 Android 的UI控件不是线程安全的,如果在多线程并发访问可能会导致UI控件处于不可预期的状态,那么为什么系统不对UI控件的访问加上锁机制呢?...Android是基于消息处理机制的,用户的行为都在这个Looper循环中,我们休眠时点击屏幕,便唤醒主线程继续进行工作。 主线程的死循环一直运行是不是特别消耗 CPU 资源呢?

1.8K20

《Android面试题思考与解答》2021年3月刊

JVM,有一种操作叫做指令重排: JVM为了优化指令,提高程序运行效率,不影响单线程程序执行结果的前提下,会将指令进行重新排序,但是这种重新排序不会对单线程程序产生影响。...为什么建议子线程不访问(更新)UI? 因为AndroidUI控件不是线程安全的,如果多线程访问UI控件那还不乱套了。 那为什么不加锁呢? 会降低UI访问的效率。...子线程,如果消息都处理完了,就需要调用quit方法停止消息循环。 Looper.loop方法是死循环为什么不会卡死(ANR)?...(为什么线程不需要单独创建Looper) 主要做了两件事: 1、main方法创建了主线程的Looper和MessageQueue,并且调用loop方法开启了主线程的消息循环。...主线程崩溃,其实都是发生在消息的处理内,包括生命周期、界面绘制。 所以如果我们能控制这个过程,并且发生崩溃后重新开启消息循环,那么主线程就能继续运行

1.3K40

Art of Android Development Reading Notes 10

Android规定UI操作只能在主线程中进行,ViewRootImpl的checkThread方法会验证当前线程是否可以进行UI操作。 为什么不允许子线程访问UI呢?...这是因为UI组件不是线程安全的,如果在多线程并发访问可能会导致UI组件处于不可预期的状态。另外,如果对UI组件的访问进行加锁机制的话又会降低UI访问的效率,所以还是采用单线程模型来处理UI事件。...(3)Handler的创建会采用当前线程的Looper来构建内部的消息循环系统,如果当前线程不存在Looper的话就会报错。...value值,不同线程的数组是不同的,这就是为什么通过ThreadLocal可以不同线程维护一套数据的副本并且彼此互不干扰。...线程,如果手动为其创建了Looper,那么在所有的事情完成以后应该调用quit方法来终止消息循环,否则这个子线程就会一直处于等待的状态,而如果退出Looper以后,这个线程就会立刻终止,因此建议不需要的时候终止

29210

Android AsyncTask与handler

Result 后台执行任务最终返回的结果,比如String 程序调用,开发者需要做的就是实现这些方法。...可以该方法做一些准备工作,如在界面上显示一个进度条。 doInBackground(Params…),将在onPreExecute 方法执行后马上执行,该方法运行后台线程。...先讲解下编程机制: 我们通常在UI线程创建一个handler,handler相当于一个处理器,它主要负责处理和绑定到该handler的线程的message。...因为我们这里handler是UI线程实现的,所以经过这么一个handler、message机制,我们就可以回到UI线程中了。 handler:处理后台进程返回数据的工作人员。...注意,handler是UI线程声明的,如果我们直接类似代码执行一个线程的话,实际上并没有创建一个新的线程,因为handler已经跟默认的UI线程的looper绑定了。

72230

你真的了解Handler吗

说白了,其实死循环也是有意为之,线程可执行代码执行完后,就会终止,而主线程肯定需要一直运行,所以死循环就能保证这一点。 「死循环之外怎么处理事务?」...既然主线程是死循环,那么如果有其他事务该怎么处理呢?创建线程呗,线程创建之前会创建一些其他的binder线程,比如ApplicationThraed。...「死循环是不是会浪费cpu资源」 主线程的messageQueue没有消息的时候,会阻塞在loop的queue.next方法,此时主线程会释放CPU资源,进入休眠状态,直到下个消息来到,所以不会一直消耗...监听主线程UI操作已完成。既然都执行到我这里来了,就说明UI操作都完成了是吧。 「面试题5:同步屏障机制是什么,有什么呢?」...可以统一管理后台任务,运行在前台,所以可以获取到上下文。 而IntentService同样具有这些特性,并且可以线程管理任务,工作执行完自动销毁。

65630
领券