Android 通信机制之handler消息机制详解源码分析与使用

本文详细解析了Android中的Handler通信机制,包括Handler的介绍、使用原因、作用和使用方法。深入探讨Handler的构造方法、常用方法,以及源码理解,如四大核心对象(Message、Looper、MessageQueue、Handler)的关系。此外,还介绍了Message类的用途和Handler发送、处理消息的流程。最后,文章展示了Handler在更新UI、延时任务等方面的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

目录

 

Handler介绍:

1,什么是handler:

2,为什么使用handler

3,handler有什么用: 

4, 怎么使用handler 

Handler常用方法

1,Handler构造方法:

2,Handler公共方法:

公共方法

Handler 源码理解

1,Handler四大核心对象:

2,原理图:

3,Message类介绍:

4,Handler()构造 (取出looper对象)

5,ActivityThread(存Looper对象)

6,Handler发送消息

7,Handler内部进行取消息 ,并且进行处理

handler使用:

post(Runnable r)在子线程更新UI时使用

sendEmptyMessage发送空标记消息

sendMessage发送标记消息

postDelayed延时更新UI

总结:


Handler介绍:

1,什么是handler:

【1】Android消息机制: handler是更新UI界面的机制,也是消息处理的机制,我们可以发送消息,也可以处理消息
 
【2】Handler允许您发送和处理Message和与线程的MessageQueue...每个Handler实例都与单个线程和该线程的消息队列相关联。
 
【2】当您创建一个新的Handler时,它被绑定到创建它的线程的线程/消息队列--从那时起,它将把消息和运行程序传递到消息队列中,并在它们从消息队列中出来时执行它们。 
 
【3】基本原理的概括:Handler是发送消息Message给Looper,Looper是封装消息的载体,Looper中封装了一个MessageQueue,Looper.loop()是把消息MessageQueue中的消息返还给Handler.
 
 

2,为什么使用handler

【1】问题:ANR :application not response  应用无响应
            
  • 当应用程序在主线程(main线程 ui线程)进行耗时(比如连接网络,拷贝大的数据 )的操作 一般5秒钟无响应就会报ANR为了避免出现ANR我们把耗时操作放在子线程去做,但是在子线程去更新UI会报错误
10-06 02:17:57.778: W/System.err(1596): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

 

【2】只有在主线程才能更新UI,我们要开始用Handler了。handler 也可以用于延时操作。
 
 

3,handler有什么用: 

【1】调度消息和运行表,以便在将来的某个时间点执行; 
 
【2】将要在与您自己的线程不同的线程上执行的操作排队。 
 
【3】Handler是android封装好的一套更新UI的机制,也是发送消息,传递消息,处理消息的机制,如果要想更新UI,就必须要遵循这套机制,否则就会抛出异常。
  • 例如我们使用多线程来更新UI时,如果没有加锁的话,会产生界面错乱,但是如果增加了锁,但是性能又会下降,根据一行产生的问题android给我们封装好了一套更新UI的机制,我们只需要遵循这套机制即可。否则我们需要自己写。要处理这些问题。 
 

4, 怎么使用handler 

【1】调度消息使用方法:
  • 调用方法允许您在消息队列接收到可运行对象时对它们进行排队,通过Message对象发送讯息由Handler理的一系列数据。handleMessage(Message)方法(要求您实现Handler的子类)。
 
post(Runnable)
post(Runnable)
 sendMessage(Message)
sendMessageAtTime(Message, long)
postAtTime(java.lang.Runnable, long)
postDelayed(Runnable, Object, long)
sendEmptyMessage(int)
sendMessageDelayed(Message, long)
【2】对象将当投递或发送到Handler时,您可以允许在消息队列准备就绪时立即处理该项,或者在消息队列被处理之前指定一个延迟,或者指定处理它的绝对时间。后两者允许您实现超时、滴答和其他基于时间的行为。 
 
【3】当为应用程序创建进程时,其主线程专用于运行消息队列,负责管理顶级应用程序对象(活动、广播接收器等)及其创建的任何窗口。您可以创建自己的线程,并通过Handler与主应用程序线程进行通信。这是通过调用相同的岗或发送讯息方法,但来自您的新线程。然后在Handler的消息队列中对给定的可运行或消息进行调度,并在适当时进行处理。



Handler常用方法

 

1,Handler构造方法:

Handler()

 

默认构造函数将此处理程序与Looper用于当前线程。

Handler(Handler.Callback callback)

 

构造函数将此处理程序与Looper对于当前线程,并接受一个回调接口,您可以在其中处理消息。

Handler(Looper looper)

 

使用所提供的Looper而不是默认的。

Handler(Looper looper, Handler.Callback callback)

 

使用所提供的Looper而不是默认的,而是接受一个回调接口来处理消息。

2,Handler公共方法:

公共方法

 

 

static Handler

createAsync(Looper looper, Handler.Callback callback)

 

创建一个新的Handler,其发布的消息和运行程序不受同步障碍(如显示vsync)的限制。

static Handler

createAsync(Looper looper)

 

创建一个新的Handler,其发布的消息和运行程序不受同步障碍(如显示vsync)的限制。

void

dispatchMessage(Message msg)

在这里处理系统消息。

final void

dump(Printer pw, String prefix)

 

final Looper

getLooper()

 

String

getMessageName(Message message)

 

返回表示指定消息的名称的字符串。

void

handleMessage(Message msg)

 

子类必须实现这一点才能接收消息。

final boolean

hasCallbacks(Runnable r)

 

检查消息队列中是否有带有回调r的挂起的消息。

final boolean

hasMessages(int what)

 

检查消息队列中是否有代码“什么”的挂起的消息。

final boolean

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兴帅_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值