Handler机制

article/2025/11/6 2:34:18

1.为何引入Handler机制

Handler是线程间通讯的机制,Android中,网络访问、文件处理等耗时操作必须放到子线程中去执行,否则将会造成ANR异常。

ANR异常:Application Not Response 应用程序无响应

产生ANR异常的原因:在主线程执行了耗时操作,对Activity来说,主线程阻塞5秒将造成ANR异常,对BroadcastReceiver来说,主线程阻塞10秒将会造成ANR异常。

解决ANR异常的方法:耗时操作都在子线程中去执行

但是,Android不允许在子线程去修改UI,可我们又有在子线程去修改UI的需求,因此需要借助Handler。

2.Handler机制原理

UI线程创建时,就创建了一个Looper,Looper内部维护这一个MessageQueue。
Looper通过开启一个while(true)死循环来轮询MessageQueue中的Message。
当Looper轮询到Message时,就分发此Message。

Handler在子线程发送消息到MessageQueue,Message被Looper取出来后,分发给handler的handleMessage方法来处理。

那么,为什么说一个Looper可以对应多个Handler,Looper如何保证哪个Handler发出去的Message将交由哪个handler来处理?

因为Handler在发送Message的时候,在Message的成员变量target上标记了当前handler的引用:

 message.target = this;   this即这个发送此Message的handler对象

当Looper取到message时,通过下面的方法分发Message:

 message.target.dispatchMessage(message);  

message.target即发送此Message的handler对象

因此,哪个handler发送的Message,将由哪个Handler来处理此Message

在这里插入图片描述

  • Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。

  • Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息。

  • Message Queue(消息队列):用来存放线程放入的消息。

  • 线程:UIthread 通常就是main thread,而Android启动程序时会替它建立一个MessageQueue。

3.while(true) {//死循环,会不会把主线程卡死???

不会被卡死。 涉及到Linux下的通讯机制,管道通讯的概念,管道就是内存中的一个特殊的一个文件,这个文件有两个句柄(其实就是java中的引用),一个是读的引用,一个是写的引用,当写的一端写入内容时,读的一端就会被唤醒,读的一端在没有读到消息时会休眠

4.handler内存泄漏问题解决

public class MainActivity extends Activity {private Handler mHandler = new MyHandler(this);private static class MyHandler extends Handler {private SoftReference<Context> srf;public MyHandler(Context context) {srf = new SoftReference<Context>(context);}public void handleMessage(android.os.Message msg) {Toast.makeText(srf.get(), "", 0).show();};}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}@Overrideprotected void onDestroy() {mHandler.removeCallbacksAndMessages(null);}
}

http://chatgpt.dhexx.cn/article/0MqyxjSE.shtml

相关文章

Handle消息机制解析

概述 Handler消息机制(由Handler/Looper/MessageQueue等构成)&#xff0c;Android有大量的消息驱动方法来进行交互&#xff0c;就像Android的四大组件(Activity、Service、Broadcast、ContentProvider)的启动过程交互&#xff0c;都离不开Handler的消息机制&#xff0c;所以An…

Handler机制(一)——Handler运行流程分析

1 概述 Handler机制是Android的异步消息处理机制&#xff0c;用于在线程间传递消息&#xff0c;主要涉及到四部分&#xff1a;Handler、Looper、Message和MessageQueue。其中Handler是消息的发送者和处理者&#xff1b;Message是消息主体&#xff1b;MessageQueue是消息队列&a…

reshape的作用

reshape就是矩阵的变换就是行和列相乘的数相等就可以相互变换

reshape函数

在opencv中&#xff0c;reshape函数比较有意思&#xff0c;它既可以改变矩阵的通道数&#xff0c;又可以对矩阵元素进行序列化&#xff0c;非常有用的一个函数。 函数原型&#xff1a; C: Mat Mat::reshape(int cn, int rows0) const 参数比较少&#xff0c;但设置的时候却要千…

Reshape的命令应用

import numpy as np tnp.arange(0,64).reshape(8,8) print(t) Reshape 的参考使用&#xff1a; (1条消息) Python的reshape的用法&#xff1a;reshape(1,-1)_冷月无声的博客-CSDN博客_reshape函数pythonhttps://blog.csdn.net/qq_29831163/article/details/90112000Reshape主…

matlab中reshape的用法,reshape2 函数 reshape 的用法

函数 reshape 的用法 请我在MATLAB编程中遇到了一个问题&#xff0c;函数reshape的用法我就是没有弄B reshape(A,m,n) 返回一个m*n的矩阵B&#xff0c; B中元素是按列从A中得到的。如果A中元素个数没有m*n个&#xff0c; 则会引发错误。 B reshape(A,m,n,p,...)和B reshape(…

Numpy之reshape()详解

Numpy中reshape的使用方法为:numpy.reshape(a, newshape, orderC) 参数详解&#xff1a;1.a: type:array_like(伪数组&#xff0c;可以看成是对数组的扩展&#xff0c;但是不影响原始数组。) 需要reshape的array2.newshape:新的数组 新形状应与原形状兼容。如果是整数&#xf…

利用Numpy库的方法reshape()对ndarray对象矩阵的形状进行调整

利用Numpy库的函数reshape()对ndarray对象矩阵的形状进行调整 调整矩阵或图像的形状是一个常用的操作。 在Numpy库中&#xff0c;可使用函数reshape()实现此操作。 其函数原型如下&#xff1a; dst numpy.reshape(a, newshape[, orderC])参数意义如下&#xff1a; a—需要调…

关于reshape

X.reshape(X.shape[0], -1).T和X.reshape(-1&#xff0c;X.shape[0]) 虽然矩阵形式仍然一致但矩阵元素排列完全不同 在降低测试集维度时注意&#xff0c;应使用X.reshape(X.shape[0], -1).T

matlab reshape 用法,函数 reshape 的用法

函数 reshape 的用法别问小编过得好不好不好你也帮助不了好也不是你的功劳。 请小编在MATLAB编程中遇到了一个问题,函数reshape的用法小编就是没有弄B = reshape(A,m,n) 返回一个m*n的矩阵B, B中元素是按列从A中得到的。如果A中元素个数没有m*n个, 则会引发错误。 你知道失望…

【晕头晕脑的Python】Python中Reshape函数解析

Reshape函数解析 Reshape()作用&#xff1a;Reshape()实例说明&#xff1a;一维reshape() 为 二维二维数组 reshape 切片&#xff0c;逆置三维Reshape情况 Reshape()作用&#xff1a; Reshape&#xff08;&#xff09;&#xff0c;函数的作用就是将数据的按照既定的维度进行整…

python中reshape的用法

python中reshape的用法 reshape函数的使用&#xff1a; #reshape&#xff08;&#xff09;是数组对象中的方法&#xff0c;用于改变数组的形状 arr [1,2,3,4,5,6,7,8,9] import numpy as np arrnp.array(arr) #一维 #变成一个3 * 3的二维矩阵&#xff1a; #方法一 arr.resha…

Python的reshape的用法

numpy中reshape函数的三种常见相关用法 reshape(1,-1)转化成1行&#xff1a; reshape(2,-1)转换成两行&#xff1a; reshape(-1,1)转换成1列&#xff1a; reshape(-1,2)转化成两列 numpy中reshape函数的三种常见相关用法 numpy.arange(n).reshape(a, b) 依次生成n个自然…

python中reshape函数用法详解

python中reshape函数用法详解 reshape函数 reshape函数是Numpy库中的一个函数&#xff0c;可以用于改变一个数组的形状&#xff0c;例如将一个二维数组转换成一个三维数组。 import numpy as np # 创建一个二维数组&#xff0c;形状为(4, 6) a np.array([[1, 2, 3, 4, 5, 6]…

ORA-12162 :TNS 指定的网络服务名不正确

原因&#xff1a;这台服务器有多个库 在环境变量文件/home/oracle/.bash_profile中也没有export ORACLE_SIDxxx 解决方法&#xff1a; 登录前先export ORACLE_SIDxxx 再确保查看一下echo $ORACLE_SID 再登录sqlplus / as sysdba

ORA-12162错误解决

新来的一个小伙儿&#xff0c;想学习Oracle我给了他文档&#xff0c;自己研究着&#xff0c;下午时段叫我过去&#xff0c;发现其在装oracle后&#xff0c;进行测试时报ORA-12162错误&#xff0c;正好本鸟之前也遇到过&#xff0c;这里面贴出了大家如有遇到不要惊慌。 报错图片…

ORA-12162: TNS:net service name is incorrectly specified

概述 因未设置系统环境变量ORACLE_SID导致ORA-12162错误 分析原因 首先登录数据库主机执行 oerr ora 12162 我们首先查看看下 tnsnames.ora文件 执行tnsping CC命令 检查下是否可以tnsping通&#xff0c;核对IP和端口以及实例名 数据库服务器端使用TNSNAMES.ORA中记录的…

Oracle“ ORA-12162:TNS:net服务名称指定不正确”错误和解决方案

During the connection to the Oracle Database server with the sqlplus we may get an error with the ORA-12162 specifier. This error will prevent to connect to the Oracle Database Server. 在使用sqlplus连接到Oracle数据库服务器的过程中,ORA-12162说明符可能会出错…

androidstudio自定义Dialog

新建一个XML文件&#xff0c;文件名为layout_custom_dialog <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"androi…

Kotlin中自定义dialog

文章目录 效果dialog样式dialog 背景 common_dialog_bgdialog布局 base_common_dialog_layout全局工具类 CommonDialog&#xff08;建造者模式&#xff09;使用 效果 dialog样式 <style name"custom_dialog2" parent"android:style/Theme.Dialog">&l…