腾讯Android面试 Handler中有Loop死循环,为什么没有阻塞主线程,原理是什么

style="text-indent:2em;">其实handler为什么不会阻塞线程的问题并不复杂,但是又很多的朋友都不太了解不建议使用handler,因此呢,今天小编就来为大家分享handler为什么不会阻塞线程的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

本文目录

  1. handlerpost和viewpost区别
  2. handler消息机制的作用
  3. handler延时机制原理
  4. handler为什么不会阻塞线程

handlerpost和viewpost区别

handlerpost和viewpost是两个常用的Java线程模型,它们之间最主要的区别在于执行上下文的不同。

handlerpost是在UI线程中运行的,主要用于发送消息到UI线程进行处理,例如更新UI元素等任务;而viewpost则是在非UI线程中运行的,主要用于发送消息到UI线程进行处理,例如从后台线程向UI线程发送通知等任务。两个线程模型的适用场景不同,开发者可以根据实际需要选择合适的线程模型来实现相应的功能。

handler消息机制的作用

Handler的主要功能是将一个任务切换到某个指定的线程中去操作,这是因为Android规定UI操作只能在主线程,不然就会抛出异常,原因是因为ViewRootImpl对UI操作做了验证,通过ViewRootImpl的checkThread方法来完成

handler延时机制原理

handler发送延时消息就通过向messagequeue中按照消息执行时间when添加链表后,通过next方法不断获取出来,对比当前时间与执行时间的大小,设置超时阻塞等待时间nextPollTimeoutMillis,然后调用本地方法通过looper.cpp中使用epoll_wait实现阻塞等待超时时间到达。

handler为什么不会阻塞线程

在多线程编程中,handler(处理程序)是指一个可以接收并处理消息的函数或方法。在某些情况下,当handler执行时会涉及到一些时间较长的操作,如果使用同步方式调用,就可能会导致线程被阻塞,影响程序的响应性能和稳定性。为了避免这种情况的发生,通常可以使用异步方式来调用handler。

使用异步方式调用handler时,handler方法会被加入到一个任务队列中,然后由线程池中的线程异步地执行,因此不会阻塞当前线程。在Android中,通常会使用Handler、Looper和MessageQueue等机制来实现异步消息处理。当有新的消息要处理时,Handler会将消息加入到MessageQueue中,然后使用Looper不断循环获取消息,并通过Handler进行处理,这样就可以避免阻塞线程,保证程序的响应性能和稳定性。

总之,handler不会阻塞线程主要是因为它使用了异步方式进行消息处理。

关于handler为什么不会阻塞线程,不建议使用handler的介绍到此结束,希望对大家有所帮助。

android通过Handler使子线程更新UI