1.Handler的工作流程

详解
文章目录2.流程中的重要的几个方法 2..post()与.()2.的源码2..()2.消息机制与时间排序 3.的相关知识 3.2内存泄漏 4.
本来按照《开发艺术探索》的进度我应该现在该看线程和线程池了,但是突然觉得那块还有好多东西没有看,要是一并写到 线程和线程池那块有点头重脚轻,所以还是单独写一篇博客,详细解数一下1.的工作流程
的主要作用是将一个任务从它自己的线程切换到某个指定中的线程去执行
我们用它的主要场景就是,在子线程中无法访问UI,我们只能通过但不限于用来将它从子线程切换到UI线程来执行
至于为什么不能在子线程中访问UI,《艺术开发探索》给出过解释,大概就是说,
无法保证非主线程的安全性,多线程的并发操作可能导致UI控件处于不可预期的状态 , 
解决这种问题本可以用锁,但是使用了锁之后,会导致2个问题
锁的这种机制会让UI访问的逻辑变复杂会降低UI访问效率,因为加上锁之后保证了多线程的原子性 。当有一个线程在访问它的时候,其他线程无法访问它,大大降低了它的运行效率
所以我们选择在主线程又称为UI线程进行UI的访问
我们能用UI线程来访问UI,那就说明了UI线程则具备上面的三种性质
1.保证线程的安全
2.访问的逻辑简单
3.不会降低UI访问的效率
我们来了解一下为什么主线程具有上面的性质
1.1主线程具有如上性质的原因
我们清楚其实是由View和组成的,View就不必说了,而 。
我们在介绍对象创建完成的时候,它会将添加到,会创建相应的与它关联
足以见得的重要了,
在主线程中,当需要更新 UI 的时候 ,  会确保更新操作在主线程中执行 , 通过线程检查来保证线程安全性 。当其他线程尝试更新 UI(例如直接修改 UI 元素属性)时 ,  会在执行操作之前检查当前线程是否为主线程 , 如果不是主线程 , 就会抛出异常 , 阻止非主线程更新 UI 。
这样就保证了UI线程的安全性与访问的逻辑的简单
至于不会降低UI访问的效率很简单就是因为没加锁不会让某些线程处于停滞状态
前面说的有点多了,那么的工作流程到底是什么呢?
我画了一张流程图
【1.Handler的工作流程】1.2流程图
根据这张图我们来了解几个重要的方法
2.流程中的重要的几个方法 2.中的属性
可以看下这张图,里面有obj,what,,arg1,arg2,
可以用来携带任意类型的数据 。它通常用于传递消息中需要携带的额外数据 。你可以将任何对象赋值给 obj 属性 , 并在消息处理时获取和使用这些数据 。
what
int
这是一个整型数值 , 用于标识消息的类型或目的
这是一个对象 , 用于指定接收回复消息的目标
arg1
int
它们可以用来携带与消息相关的整型数据 。
arg2
int
它们可以用来携带与消息相关的整型数据 。
int
这是一个整型数值 , 表示发送该消息的应用程序的用户标识符
.() 是一个静态方法 , 用于获取可重用的对象 。它可以避免频繁地创建新的对象 , 从而提高性能和效率 。
我们这里面主要说3个
2.2.1what
一般我们在一个线程中写
Messagemessage = new Message();message.what = 1;message.obj = "2";mHandler.sendMessage(message);
然后在主线程中
Handler mHandler = new Handler(new Handler.Callback() {@Overridepublic boolean handleMessage(@NonNull Message msg) {switch (msg.what){case 1:mTextView.setText(""+message.obj);}return true;}});