Handler问题总结

本文详细介绍了Android中Handler的作用,为何使用Handler及其底层原理。Handler是子线程与主线程通讯的重要工具,用于更新UI。文章探讨了是否可以在主线程进行网络操作,解释了严格的模式限制,并分析了Handler的Looper和MessageQueue工作流程。此外,还讨论了如何在不同线程间发送消息,以及HandlerThread的使用。最后,提到了同步屏障机制,用于处理紧急异步消息的优先级。
摘要由CSDN通过智能技术生成

一、Handler是什么

Android定义的一套 子线程与主线程间通讯的消息传递机制 。


二、Handler有什么用

把子线程中的UI更新信息,传递给主线程(UI线程),以此完成UI更新操作。


三、为什么要用Handler,不用行不行

不行,Handler是android在设计之初就封装了的一套消息创建、传递、处理机制。

Android要求我们在主线程中更新UI,是要求,建议,不是规定,硬要在子线程中更新UI,也是可以的!
比如,在一个子线程中,创建一个对话框:
在这里插入图片描述
而我们平时在子线程中更新UI报错是这样的:
在这里插入图片描述
子线程更新UI也行,但是只能更新自己创建的View!Android的UI更新被设计成了单线程。

再说一个网上很常见的主线程更新UI的例子:
在这里插入图片描述
上面这段代码直接在子线程中更新了UI,却没有报错:
在这里插入图片描述
但如果在子线程中加句线程休眠模拟耗时操作的话:
在这里插入图片描述
程序就崩溃了,报错如下:
在这里插入图片描述
前面说了Android的UI更新被设计成单线程,这里妥妥滴会报错,但却发生在延迟执行后?
原因是:ViewRootImp在onCreate()时还没创建;在onResume()时,即ActivityThread的 handleResumeActivity()执行后才创建,调用requestLayout(),走到checkThread()时就报错了。


四、真的不能在主线程中做网络操作吗?

在这里插入图片描述
上述代码运行直接闪退,日志如下:
在这里插入图片描述
在 onCreate() 的 setContentView() 后插入下面两句代码:
在这里插入图片描述
运行下看看:
在这里插入图片描述
StrictMode(严苟模式)
Android 2.3 引入,用于检测两大问题:ThreadPolicy(线程策略) 和 VmPolicy(VM策略)
在这里插入图片描述
把严苟模式的网络检测关了,就可以在主线程中执行网络操作了,不过一般是不建议这样做的:
在主线程中进行耗时操作,可能会导致程序无响应,即 ANR (Application Not Responding)。

至于常见的ANR时间,可以在对应的源码中找到:

// ActiveServices.java → Service服务
static final int SERVICE_TIMEOUT = 20*1000;     // 前台
static final int SERVICE_BACKGROUND_TIMEOUT = SERVICE_TIMEOUT * 10;     // 后台
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Vue中的handler通常指的是事件处理函数,也可以称为事件处理器。在Vue中,我们可以通过v-on指令来绑定事件处理函数,例如: ``` <template> <button v-on:click="handleClick">点击我</button> </template> <script> export default { methods: { handleClick() { console.log('按钮被点击了') } } } </script> ``` 在上面的例子中,我们为按钮绑定了一个click事件的处理函数handleClick。当按钮被点击时,控制台会输出"按钮被点击了"。这就是一个简单的事件处理函数。 ### 回答2: Vue的handler(处理器)是Vue框架中的一个概念。在Vue中,handler是一种用于处理事件或响应数据的函数或方法。 在Vue中,常见的使用handler的场景包括: 1. 事件处理:Vue中的事件处理使用handler来处理触发的事件。通过在Vue组件中定义事件处理函数,并将其作为handler绑定到对应的DOM元素上,当触发事件时,handler将会被自动调用。 2. 数据响应:在Vue中,可以使用handler来处理数据的响应。通过在Vue实例中定义响应式的数据,并使用handler来监听这些数据的变化,当数据发生改变时,handler会被自动触发,从而更新相关的视图或执行其他操作。 3. 计算属性:在Vue中,计算属性也可以使用handler来实现相应的逻辑。通过定义一个计算属性,并将其handler设置为响应式数据的监听器,当相关的响应式数据发生变化时,handler会被自动调用,返回计算属性的值。 总结来说,Vue中的handler是用于处理事件或响应数据的函数或方法。它可以用于处理事件的触发、数据的响应以及计算属性的实现等场景。通过使用handler,我们可以方便地处理Vue中的各种操作,并实现页面的交互和数据的更新。 ### 回答3: Vue的handler是Vue框架中的一个重要概念,用于处理事件的函数。 在Vue中,我们可以使用v-on指令来监听DOM事件,并将事件的处理程序(handler)定义为Vue实例中的一个方法。这个方法将会在相应的事件被触发时被调用。 handler在Vue中扮演了事件处理的角色,它可以接收事件对象作为参数,用于获取事件的相关信息。在handler中,我们可以编写逻辑代码来响应事件,并对应用状态进行相应的修改。 handler除了可用于监听DOM事件外,还可以用于监听自定义事件或是Vue实例自身的生命周期钩子函数。它可以是一个直接定义在Vue实例中的方法,也可以是一个引用了其他方法的函数。 使用handler的好处在于,它可以将事件处理逻辑与模板代码进行分离,提高代码的可维护性和可读性。同时,handler可以方便地管理和处理多个不同的事件,并且可以实现事件传参和事件修饰符等高级特性。 总之,Vue的handler是用于处理事件的函数,通过定义handler,我们可以监听和响应各种事件,并实现相应的业务逻辑。它是Vue框架中非常重要的一部分,能够帮助我们构建交互丰富的应用程序。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值