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

为什么Looper.loop()不阻塞UI线程

Looper.loop()不阻塞UI线程的原因是因为它在一个无限循环中处理消息队列中的消息,而不会阻塞UI线程的执行。具体来说,Looper是Android中的一个类,它负责管理一个线程的消息循环。在UI线程中调用Looper.loop()方法后,Looper会进入一个无限循环,不断地从消息队列中取出消息并分发给对应的Handler进行处理。

这种设计的好处是可以保证UI线程的响应性能,因为UI线程不会被长时间的阻塞。当有新的消息到达时,Looper会立即将其分发给对应的Handler进行处理,而不需要等待之前的消息处理完成。这样可以保证UI界面的流畅性,用户的操作可以得到及时的响应。

然而,需要注意的是,如果在UI线程中执行耗时操作或者阻塞操作,会导致UI线程被阻塞,从而影响用户体验。因此,在开发过程中,我们应该避免在UI线程中执行耗时操作,可以使用异步任务、线程池等方式将耗时操作放在后台线程中执行,以保证UI线程的响应性能。

推荐的腾讯云相关产品和产品介绍链接地址:

  • 云服务器(CVM):提供弹性计算能力,满足不同规模业务的需求。详情请参考:https://cloud.tencent.com/product/cvm
  • 云原生容器服务(TKE):提供高度可扩展的容器化应用管理平台,简化容器集群的部署和管理。详情请参考:https://cloud.tencent.com/product/tke
  • 云数据库MySQL版(CDB):提供高可用、可扩展的关系型数据库服务,适用于各种规模的应用场景。详情请参考:https://cloud.tencent.com/product/cdb
  • 云存储(COS):提供安全可靠、高扩展性的对象存储服务,适用于存储和处理各种类型的数据。详情请参考:https://cloud.tencent.com/product/cos
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么线程不会因为Looper.loop()方法造成阻塞

Looper.loop和主线程的关系 分析Handler和应用启动的时候讲过,在创建ActivityThread时,主线程会创建Looper,并且进入Loop循环: public static void...Looper.prepareMainLooper(); Looper.loop(); 主线程阻塞 关于死循环 主线程进入一个死循环,是不是就会被阻塞?...因为主线程就是UI线程,当UI发生变化,相关消息就会传进来,Looper就会处理消息。...聊聊ANR 其实担心这个问题的人很多都是被ANR搞怕了,因为ANR就是UI线程做耗时操作了导致卡死状态,然后很多人就在想是不是UI线程进入Loop死循环后,就出现卡死,其实这两个并不是一个问题。...先上结论和上面的做个对比: UI耗时导致卡死,前提是要有输入事件,此时MessageQueue不是空的,Looper正常轮询,线程并没有阻塞,但是该事件执行时间过长(一般5秒),而且与此期间其他的事件(

2.6K10

最全java多线程总结3——了解阻塞队列和线程安全集合

阻塞队列   对于许多线程问题,都可以使用一个或多个队列来安全、优雅的进行数据的传递。...无需使用锁和条件对象,java 自带的阻塞队列就能够完美的解决这个问题。阻塞队列中所有方法都是线程安全的,所以我们进行读取、写入操作时无需考虑并发问题。...如果生产者调用: q.transer(item) 方法,这个调用会阻塞,知道 item 被消费线程取出消费。LinkedTransferQueue 实现了此接口。...本节介绍 Java 类库中提供的线程安全的集合(上一节介绍的阻塞队列也在其中)。   这类集合,size 是通过便利得出的,较慢。...map.computeIfAbsent(key,key->new LongAdder()) # 如果存在key map.computeIfPresent(key,key->key+1) # 和compute方法类似,不过处理键

1.1K30

你知道Thread线程是如何运作的吗?

创建Handler Handler可以用来实现线程间的通行。在Android中我们在子线程作完数据处理工作时,就常常需要通过Handler来通知主线程更新UI。...从上面的分析可以知道,当调用了Looper.loop()之后,线程就就会被一个for(;;)死循环阻塞,每次等待MessageQueue的next()方法取出一条Message才开始往下继续执行。...这就是为什么Looper.loop()会在queue.next()处等待的原因。 那么,一条Message是如何添加到MessageQueue中呢?...也许你已经注意到在主线程中可以直接使用Handler,而不需要Looper.prepare()和Looper.loop()。为什么可以做到这样呢?...根据之前的分析可以知道,主线程中必然存在Looper.prepare()和Looper.loop()。既然如此,为什么线程没有被loop()阻塞呢?

52520

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

线程的如何更新UI,比如Dialog,Toast等?系统为什么建议子线程中更新UI? 主线程如何访问网络? 如何处理Handler使用不当造成的内存泄漏?...,UI的更新并非只能在主线程才能进行。...)和VmPolicy(VM策略),这里把严苛模式的网络检测关了,就可以在主线程中执行网络操作了,一般是建议这么做的。...系统为什么建议在子线程中访问UI? 这是因为 Android 的UI控件不是线程安全的,如果在多线程中并发访问可能会导致UI控件处于不可预期的状态,那么为什么系统不对UI控件的访问加上锁机制呢?...缺点有两个: 首先加上锁机制会让UI访问的逻辑变得复杂 锁机制会降低UI访问的效率,因为锁机制会阻塞某些线程的执行。 所以最简单且高效的方法就是采用单线程模型来处理UI操作。

1.2K00

Android为什么不能在子线程更新UI

Android为什么不能在子线程更新UI Android为什么不能在子线程更新UI?...呢 那为什么不加锁呢 为什么一开始在Activity的onCreate方法中创建一个子线程访问UI,程序还是正常能跑起来呢 Android中子线程真的不能更新UI吗 保证上述条件1成立不就可以避免checkThread...为什么还需要开启消息循坏 使用子线程更新UI有实际应用场景吗 Android为什么不能在子线程更新UI? // Android中为什么线程不能更新UI?...; 主线程负责更新,子线程负责耗时操作,能够大大提高响应效率 UI线程非安全线程,多线程进行并发访问有可能会导致内存溢出,降低硬件使用寿命;且非线程安全不能加Lock线程锁,否则会阻塞其他线程对View...一是加锁会让UI访问变得复杂; 二是加锁会降低UI访问效率,会阻塞一些线程访问UI

1.3K20

HandlerThread详解「建议收藏」

为什么run中有notifyAll,getLooper中有wait? 为什么要设置线程优先级?为什么能防止内存泄漏和解决数据安全问题? 线程优先级设置的两种方法?两种方式的优先级范围?...一般线程执行完任务后就会停止,如果有很多任务导致频繁创建和销毁线程,会损耗系统资源。 如果子线程需要更新UI,要使用到Handler,此外需要创建Looper等操作,比较繁琐。...利用了Looper.loop()进行无限循环。...run()中Looper一旦创建好,就可以去notifyAll()让getLooper()可以返回正确的Looper 6、为什么要设置线程优先级?为什么能防止内存泄漏和解决数据安全问题?...线程优先级主要分为UI线程和后台线程(backgorund) 线程默认优先级为default,也就是UI线程,会和UI线程去平等的争抢资源。 在UI性能要求较高的场景下,应该使用后台线程

63920

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

线程的如何更新UI,比如Dialog,Toast等?系统为什么建议子线程中更新UI? 主线程如何访问网络? 如何处理Handler使用不当造成的内存泄漏?...,UI的更新并非只能在主线程才能进行。...)和VmPolicy(VM策略),这里把严苛模式的网络检测关了,就可以在主线程中执行网络操作了,一般是建议这么做的。...系统为什么建议在子线程中访问UI? 这是因为 Android 的UI控件不是线程安全的,如果在多线程中并发访问可能会导致UI控件处于不可预期的状态,那么为什么系统不对UI控件的访问加上锁机制呢?...缺点有两个: 首先加上锁机制会让UI访问的逻辑变得复杂 锁机制会降低UI访问的效率,因为锁机制会阻塞某些线程的执行。 所以最简单且高效的方法就是采用单线程模型来处理UI操作。

1.8K20

为什么 Java 坚持多线程选择协程?

NIO配合实现非阻塞的编程,提高系统的吞吐 使用起来更加舒服顺畅(async+await,跑起来是异步的,但写起来感觉上是同步的) 我们分开来讲下。...你可以理解为NIO + woker thread大致就是一套“协程”,只不过没有实现在语法层面,写起来优雅而已。问题是,你的场景真的处理了并发几十万,上百万的连接吗? 再说创建/销毁线程的开销。...然后是线程的切换开销。线程的切换实际上只会发生在那些“活跃”的线程上。对于类似于Web的场景,大量的线程实际上因为IO(发请求/读DB)而挂起,根本不会参与OS的线程切换。...现实当中一个最大200线程的服务器可能同一时刻的“活跃线程”总数只有数十而已。其开销没有想象的那么大。为了避免过大的线程切换开销,真正要防范的是同时有大量“活跃线程”。...觉得线程耗资源,可以控制线程总数,可以减少线程stack的大小,可以用线程池配置max和min idle等等。想要go的channel,可以上disruptor。

1.6K20

Android开发之漫漫长途 Ⅶ——Android消息机制(Looper Handler MessageQueue Message)

由此我们不得不说到我们Android App中的主线程UI线程,关于这个线程的叫法有很多。读者只需要知道不能在这个线程之外的线程直接对UI进行操作就行了。...那我们就从这个主线程UI线程说起)。...为了更好的理解这个方法我们先来讲一下关于线程阻塞与唤醒的知识 线程阻塞 什么是阻塞呢?...注:线程阻塞线程忙循环轮询是有本质区别的,不要听到线程阻塞就以为是CPU一直在无限循环轮询状态啊。线程阻塞是不占用CPU资源的,但是线程忙循环轮询就不一样了,将几乎占满CPU资源。...没错,是因为我们在非UI线程中更新了UI,导致了异常。原因是我们在子线程没有Looper啊。你可以做出如下更改就不会有异常了。

41520

android 线程那点事

为什么会出现ANR Android希望UI线程能根据用户的要求做出快速响应,如果UI线程花太多时间处理后台的工作,当UI事件发生时,让用户等待时间超过5秒而未处理,Android系统就会给用户显示ANR...解决办法自然还是解放UI线程,将耗时操作交给子线程,避免阻塞。...接着UI线程调用Looper.loop()方法进入消息循环体,进入后就会不断地从消息队列中读取并处理消息。...子线程为什么不能更新UI 因为UI访问是没有加锁的,在多个线程中访问UI是不安全的,如果有多个子线程都去更新UI,会导致界面不断改变而混乱不堪。...当需要快速,主动地更新View的UI,或者当前渲染代码阻塞GUI线程的时间过长的时候,SurfaceView就是解决上述问题的最佳选择。

74650

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

为什么建议子线程访问(更新) UI? 子线程访问UI的崩溃原因和解决办法? MessageQueue是干嘛呢?用的什么数据结构来存储数据? 延迟消息是怎么实现的?...怎么获取当前线程的Looper?为什么直接用Map存储线程和对象呢? ThreadL ocal运行机制?这种机制设计的好处? 还有哪些地方运用到了ThreadL ocal机制?...为什么建议子线程访问(更新)UI? 因为Android中的UI控件不是线程安全的,如果多线程访问UI控件那还不乱套了。 那为什么不加锁呢? 会降低UI访问的效率。...为什么直接用Map存储线程和对象呢? 打个比方: ThreadLocal就是老师。 Thread就是同学。 Looper(需要的值)就是铅笔。...子线程中,如果消息都处理完了,就需要调用quit方法停止消息循环。 Looper.loop方法是死循环,为什么不会卡死(ANR)?

52130

笔记——安卓消息机制Handler(十六)

UI,是同一个进程中线程间的通信机制,能够将一个任务切换到指定的线程中去执行。...()->handlerMessage(),但是在UI线程是主线程中,系统会自动调用Looper.prepareMainLooper()方法创建主线程的Looper(Looper.prepare()与Looper.loop...在其内部源代码中,每一个Looper.prepare()初始化一个MessageQueue消息队列和一个线程Thread,这也是为什么很多人说的一个Handler只能持有一个MessageQueue的原因...Looper(quitAllowed)),至于Looper,它在Android的消息机制中担负着消息轮询的角色,它会不间断地查看MessageQueue中是否有新的未处理的消息;若有则立刻处理,若无则进入阻塞...很显然,不同线程中的数组是不同的,这就是为什么通过ThreadLocal可以在不同的线程中维护一套数据的副本并且彼此互不干扰。

51740

Handler二十七问|你真的了解我吗?

网络交互后切换到主线程进行UI更新 当子线程网络操作之后,需要切换到主线程进行UI更新。 总之一句话,Hanlder的存在就是为了解决在子线程中无法访问UI的问题。...为什么建议子线程访问(更新)UI? 因为Android中的UI控件不是线程安全的,如果多线程访问UI控件那还不乱套了。 那为什么不加锁呢? 会降低UI访问的效率。...怎么获取当前线程的Looper?为什么直接用Map存储线程和对象呢? 在Handler发送消息之后,消息就被存储到MessageQueue中,而Looper就是一个管理消息队列的角色。...为什么直接用Map存储线程和对象呢? 打个比方: ThreadLocal就是老师。 Thread就是同学。 Looper(需要的值)就是铅笔。...子线程中,如果消息都处理完了,就需要调用quit方法停止消息循环。 Looper.loop方法是死循环,为什么不会卡死(ANR)?

98550

Art of Android Development Reading Notes 10

(2)Handler的主要作用是将一个任务切换到某个指定的线程中去执行。 为什么要提供这个功能呢?...Android规定UI操作只能在主线程中进行,ViewRootImpl的checkThread方法会验证当前线程是否可以进行UI操作。 为什么不允许子线程访问UI呢?...这是因为UI组件不是线程安全的,如果在多线程中并发访问可能会导致UI组件处于不可预期的状态。另外,如果对UI组件的访问进行加锁机制的话又会降低UI访问的效率,所以还是采用单线程模型来处理UI事件。...value值,不同线程中的数组是不同的,这就是为什么通过ThreadLocal可以在不同线程中维护一套数据的副本并且彼此互不干扰。...main,其中调用了Looper.prepareMainLooper()来创建主线程的Looper以及MessageQueue,并通过Looper.loop()方法来开启主线程的消息循环。

29210

04.Android崩溃Crash库之Loop拦截崩溃和ANR

,自行上报崩溃信息"); } }); } } ``` 通过上面的代码就可以就可以实现拦截UI线程的崩溃,耗时性能监控。...在main方法的最后调用了 Looper.loop(),在这个方法中处理主线程的任务调度,一旦执行完这个方法就意味着APP被退出了。...Looper.loop()方法 在这个方法中写了一个循环,只有当 queue.next() == null 的时候才退出,看到这里我们心里可能会有一个疑问,如果没有主线程任务,是不是Looper.loop...实际上queue.next()其实就是一个阻塞的方法,如果没有任务或没有主动退出,会一直在阻塞,一直等待主线程任务添加进来。 当队列有任务,就会打印信息 Dispatching to ......,就会退出循环,意味着APP崩溃,所以我们我们需要进行try-catch,避免APP退出,我们可以在主线程再启动一个 Looper.loop() 去执行主线程任务,然后try-catch这个Looper.loop

1K20
领券