文章目录
Handler
是用于在不同线程之间进行消息传递的机制。它与
Looper
和
MessageQueue
一起工作,帮助在不同线程间传递和处理消息,特别是在主线程与子线程之间进行通信。
用处
- 子线程通过
Handler
更新 UI - 用于线程间通信
基本用法
用法一:使用sendMessage和handleMessage方法
-
创建Handler:通常在主线程中创建一个
Handler
,用于处理从其他线程发送的消息。Handler handler = new Handler();
-
发送消息:在子线程中,通常使用
handler.sendMessage()
来向主线程发送消息。new Thread(new Runnable() { @Override public void run() { Message message = Message.obtain(); message.what = 1; handler.sendMessage(message); } }).start();
-
处理消息:主线程中的
Handler
会调用handleMessage()
方法来处理接收到的消息。Handler handler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { switch (msg.what) { case 1: // 处理消息 break; } } };
用法二:使用post方法
-
创建
Handler
:Handler handler = new Handler(Looper.getMainLooper());
-
使用
post
方法:可以直接在Handler
中执行需要在主线程上运行的代码块。handler.post(new Runnable() { @Override public void run() { // 执行主线程任务 } });
区别:
sendMessage
: 适用于更复杂的消息处理和任务调度,特别是需要在多个线程之间通信时。它依赖于Handler
类,通过消息机制来传递和处理任务。post
: 更加简洁和直接,主要用于在主线程中执行任务,尤其是需要更新 UI 的情况。适合用于在视图中直接执行代码而不涉及复杂的线程通信。
法一工作原理
主要依靠以下
-
Looper:负责不断从
MessageQueue
中取出消息并分发给相应的Handler
进行处理。 -
Handler:
Handler
是一个用于发送和处理消息的类。它可以用来将Message
或Runnable
对象发送到消息队列中,并在对应的线程中处理这些消息。 -
Message:用于在
Handler
和Looper
之间传递消息。 -
MessageQueue:
MessageQueue
是消息的容器,负责存储和管理待处理的消息。维护了一个消息队列,按顺序处理消息。
举个例子:
天气预报:子线程获取到了天气数据,然后使用
Message
将数据包装,通过Handler
对象的sendMessage
方法将Message
对象插入到消息队列(MessageQueue
)中,主线程通过Looper.loop
方法死循环检查MessageQueue
中是否有消息,主线程的Handler
会通过handleMessage()
方法接收这个Message
Handler的sendMessage
handler.sendMessage(message);
sendMessageDelayed
,sendEmptyMessageAtTime
,sendEmptyMessageDelayed
,sendEmptyMessage
这些Handler
类中发送消息的方法最终调用的方法都是sendMessageAtTime
。
sendMessageAtTime
方法中再调用