看到Handler中的消息处理函数:
public void dispatchMessage(Message msg){...}
这个函数是在Looper的执行消息循环loop()的时候取出Message然后执行:
msg.target.dispatchMessage(msg);
时,msg对象的target就是这个Handler对象,即执行了Handler的dispatchMessage()函数:
函数定义如下:
/** * Handle system messages here. */ public void dispatchMessage(Message msg) { if (msg.callback != null) { handleCallback(msg); } else { if (mCallback != null) { if (mCallback.handleMessage(msg)) { return; } } handleMessage(msg); } }
从这个函数中可以看到,执行顺序逻辑是这样的:
1.如果Message对象有CallBack回调的话,就只执行这个回调,然后就结束了。
可见如果要使用Message的CallBack的话,就别在用其他的东西了。其实是个Runnable对象。
例如我们可以这样构建Message的CallBack:
Message msgCallback = Message.obtain(myHandler, new Runnable() { @Override public void run() { Log.d(TAG, "msgCallback Runnable run() tid : " + Thread.currentThread().getId()); } });
2.else分支下,如果Handler的CallBack对象不为空,那么就执行它的handleMessage()函数。
如果这个函数return true,那么就直接推出了,不会执行下面了。如果return false的话,就继续执行3.
例如我们可以这样来构建一个Handler的CallBack对象:
private Handler.Callback callback = new Handler.Callback() { @Override public boolean handleMessage(Message msg) { Log.d(TAG, "Handler.Callback handleMessage msg : " + msg.what); Log.d(TAG, "Handler.Callback handleMessage tid : " + Thread.currentThread().getId()); return false; // return true; } };
3.这才调用到了Handler的handleMessage()函数,也就是我们经常要在子类覆写的这个函数,从中我们可以做消息的处理。
附件中是我的测试Demo,也同时解惑了我的一个疑问,那就是Runnable对象到Handler中执行的时候,是不是另启动了新的线程呢?答案是否定的,这个Runnable对象只是被调用了它的run()方法,就像是一个普通的方法被调用了一样,根本就没有start一个线程,所以这个run()方法也是在Handler所在的线程中被执行的。
这个是handleCallback函数:
private static void handleCallback(Message message) { message.callback.run(); }
可以看到,只是调用了message对象的Runnable对象的run()函数。
当然,还得分析Handler的post(Runnable r)方法的Runnable对象最终是怎么被执行的,才能彻底解决我的疑问。
这个是Handler的post方法:
public final boolean post(Runnable r) { return sendMessageDelayed(getPostMessage(r), 0); }
看到把Runnable对象r传到getPostMessage中了。
Handler中的getPostMessage方法:
private static Message getPostMessage(Runnable r) { Message m = Message.obtain(); m.callback = r; return m; }
可以看到,原来是这样啊。使用了Runnable对象r从Message中obtain()分配出一个Message对象出来,然后调用的是sendMessageDelayed来发送消息。
这就对了,我们自己post的Runnable对象,也不过是放到了Message的Runnable对象中了,也就是Message对象的CallBack了。他有优先执行的权利,事实上,我们如果通过post一个Runnable的话,也没办法修改更多的Message对象的参数信息了,所以只执行到这个Runnable也是合理的。
但是我却几乎没使用过Handler的callback对象,看来这个东西还是可以做优先级的消息过滤的,如果return true的话,就不去继续执行了。这个以后还是要研究研究具体怎么应用场景的啦。
相关推荐
【Android Handler机制】是Android应用程序中用于线程间通信的核心组件,它与Looper和Message紧密配合,实现消息的发送、处理以及线程间的同步。在Android应用开发中,尤其是涉及到UI更新时,Handler机制显得尤为...
标题“android handler的一些测试”暗示我们将探讨`Handler`如何在多线程环境下工作,以及它如何决定处理特定的消息。 `Handler`类的主要作用是接收并处理`Message`对象,这些消息通常在不同的线程中创建。在...
Handler是Android中的一个类,它用于在不同的线程之间发送和处理消息。通常,我们使用Handler配合Looper和Message来实现在主线程(UI线程)中执行后台任务的结果。Looper是消息队列的循环器,它不断检查消息队列并...
3. **Handler**:Handler是用来发送消息和处理消息的对象。通过Handler,我们可以将需要处理的消息或Runnable对象发送到消息队列中,进而通过Looper循环处理这些消息或Runnable对象。Handler是连接主线程和子线程的...
- **处理消息**:当消息从MessageQueue中取出后,Handler会调用`handleMessage()`方法来处理消息。这个方法通常在定义Handler时被重写,以便根据消息内容执行特定的操作。 #### 三、工作流程 - **消息发送**:应用...
在处理消息的过程中,Looper会按照先进先出(FIFO)的顺序从队列中取出Message。这意味着,如果同时有多个Message待处理,它们会按发送的顺序依次被处理。Handler的handleMessage()方法是实际处理Message的地方,...
- **定义**:Handler是一种消息处理机制,它允许开发者在不同的线程之间发送和处理消息或指令。 - **作用**:主要用来更新UI或处理异步任务的结果。例如,可以在后台线程中执行耗时操作(如网络请求),并将结果通过...
- 当消息被取出后,`Handler`调用`handleMessage()`方法处理消息。 #### 四、实例演示 假设我们需要在子线程中执行耗时操作,并在完成后更新UI。可以按以下步骤实现: 1. **创建Handler对象**: ```java ...
这个过程涉及到了`Looper.prepareMainLooper()`、`Looper.loop()`等方法,它们创建并启动了主线程的Looper,使得Handler能够有效地处理消息。 总的来说,Android Handler的消息派发机制是通过`Handler`、`Message`...
在实际应用中,我们可以根据业务逻辑调整事件处理方式,例如,当队列中有多个事件时,可以设置消息队列,让Handler按顺序处理这些事件,确保并发事件的序列化执行。 总结,利用Handler和ArrayList处理并发事件是一...
### Android中异步消息处理...Looper负责创建消息循环并在循环中处理消息,MessageQueue用于存储消息,而Handler则作为消息的发送者和接收者。掌握这些基本概念对于理解和解决Android应用程序中的多线程问题至关重要。
在Android开发中,`Handler`是一个非常重要的组件,它用于处理来自其他线程的消息,特别是在UI线程中更新用户界面时。本节我们将深入探讨`Handler`的使用,以及如何解决像更新标题这样的定时任务。 首先,让我们...
每个Message在队列中按照顺序等待处理,一旦被Looper取出,就会按照顺序传递给对应的Handler。 3. **Handler(处理器)**:Handler主要负责处理Message。它有两个关键职责:一是将Message放入消息队列,二是从队列...
主线程默认有一个Looper,而子线程如果没有初始化Looper,则无法直接处理消息。Handler的`sendMessage()`方法用于发送消息,`handleMessage()`方法则在接收到消息时被调用,执行相应的处理逻辑。 2. **Thread**:...
本文将深入探讨在`Activity`中如何有效地管理并使用多个`Handler`来处理消息,以及它们的工作原理。 1. **Handler的基本原理** `Handler`、`Looper`和`MessageQueue`三者构成了Android的消息传递机制。`Handler`...
在Android开发中,`Handler`是一个至关重要的组件,它用于处理主线程中的消息调度和更新UI。本篇文章将深入探讨`Handler`的工作原理及其在实际应用中的使用方式,特别是通过`Looper`、`Message`和`MessageQueue`的...
- **Handler**:负责发送和处理消息的对象。通过`sendMessage()`发送消息,消息最终会在`handleMessage()`中被处理。 - **MessageQueue**:存放所有通过Handler发送的消息的队列。消息在此等待被处理。 - **Looper**...
处理消息的过程发生在主线程的 Handler 实例中。当你创建 Handler 时,可以通过匿名内部类重写 `handleMessage(Message msg)` 方法,定义消息处理逻辑。主线程会自动调用这个方法来处理来自消息队列的消息。 以下是...