浅析Android Handle机制

一.Handle的用例:

1.创建handle实例

new handle();

2.发送信息载体(Message)

sendMessage(msg);

3.处理消息

handleMessage(Message msg){};

二.原理浅析

结合以上的handle调用三部曲,我们将顺藤摸瓜理清Handle、Looper、Message、MessageQueue的逻辑与关系。

1.new Handle():这个操作将生成一个Handle实例,handle实例有三个属性mLooper、mQueue、mCallback,以下解释这三个属性的来历。

1.a:

mLooper = Looper.myLooper();Looper的myLooper静态方法也很简单、
public static Looper myLooper() {
 return sThreadLocal.get();
}

sThreadLocal是一个单例对象,他的类型是ThreadLocal<Looper>,这个类有set()、get()方法,他的作用是当前线程的对象,那么这句代码的作用很明显了就是返回当前线程的Looper对象。再深入一点想,他的set方法在哪里呢?答案是在prepare中:

private static void prepare(boolean quitAllowed) {
 if (sThreadLocal.get() != null) {
    throw new RuntimeException("Only one Looper may be created per thread");
 }
 sThreadLocal.set(new Looper(quitAllowed));
}

从该方法中可见每个线程中只可以调用一次prepare方法,即每个线程中只有一个Looper对象。

1.b:

mQueue = mLooper.mQueue;

Looer对象的mQueue是一个非静态的变量,即:

final MessageQueue mQueue;

他亦在Looper创建时候生成,MessageQueue我们暂时简单理解为消息队列,但是切记他并非等同于:Queue<Message>

1.c:mCallback是一个回调接口,他只有一个方法handleMessage:

public interface Callback {
<span style="white-space:pre">	</span>public boolean handleMessage(Message msg);
}

2. sendMessage(msg):

这个操作正是他们之间联系的枢纽我们一一来看,首先msg的生成,再看发送msg的动作。

2.a:msg的生成;在Message类中我们看到有个Handle类型的target,所有发送到Handle的msg都会把这个target设置为当前的Handle,如sendMessage()方法最终会有这样一个操作:

msg.target = this;

2.b:sendMessage();无论那个重载方法最终都调用queue.enqueueMessage(msg, uptimeMillis);这个方法中会根据when这个参数来进行排队。即在1.b中的消息队列中排序。

3.handleMessage:处理Message的操作在Looper类中的loop方法中,回顾到1.a我们知道Looper是当前线程的一个单例,即当前线程的所有Message都会再次被处理。Loop方法中有一个死循环将遍历mQueue中的Message并执行dispatchMessage(msg)方法:

msg.target.dispatchMessage(msg);

可见msg的target将处理自己。

方法再次回到Handle类的dispatchMessage方法

    public void dispatchMessage(Message msg) {
        if (msg.callback != null) {
            handleCallback(msg);
        } else {
            if (mCallback != null) {
                if (mCallback.handleMessage(msg)) {
                    return;
                }
            }
            handleMessage(msg);
        }
}

如果mCallback不为空就执行mCallback的handleMessage方法,否则执行自身的handleMessage方法。

4.总结:Android通过如此巧妙的结构实现了线程间的通信,如果要弄的彻底明白,以Activity为例,在Activity中找到mainThread即我们通常说的主线程,可以清楚的看到looper的创建以及如何进行消息管理。

浅析Android Handle机制

时间: 2025-01-05 16:44:13

浅析Android Handle机制的相关文章

Android中对Handle机制的理解

一.重要參考资料 [參考资料] 眼下来看,以下的几个网址中的内容质量比較不错.基本不须要再读别的网址了. 1.android消息机制一 http://xtfncel.javaeye.com/blog/663517 Android消息机制(一) 一.    角色描写叙述 1.Looper: 一个线程能够产生一个Looper对象.由它来管理此线程里的Message Queue(消息队列). 2.Handler: 你能够构造Handler对象来与Looper沟通.以便push新消息到Message Q

(Android系统)android log机制浅析

在android下面debug,最主要的方式就是用logcat抓log了,我们可能有尝试过使用printf来打印,当然结果是不行的,这里有时间就看了一下android平台下log的flow,在此做个笔记以作记录 我们一般使用ALOGD来打印log,所以这里就跟一下ALOGD的flow system/core/include/log/log.h system/core/include/log/log.h #ifndef ALOGD #define ALOGD(...) ((void)ALOG(LO

Android线程机制浅析(ppt)

Android线程机制浅析(ppt)

浅析Android中的消息机制(转)

原博客地址:http://blog.csdn.net/liuhe688/article/details/6407225 在分析Android消息机制之前,我们先来看一段代码: 1 public class MainActivity extends Activity implements View.OnClickListener { 2 private TextView stateText; 3 private Button btn; 4 5 @Override 6 public void onC

浅析Android中的消息机制-解决:Only the original thread that created a view hierarchy can touch its views.

在分析Android消息机制之前,我们先来看一段代码: [html] view plaincopyprint? public class MainActivity extends Activity implements View.OnClickListener { private TextView stateText; private Button btn; @Override public void onCreate(Bundle savedInstanceState) { super.onC

浅析Android中的消息机制(转)

在分析Android消息机制之前,我们先来看一段代码: public class MainActivity extends Activity implements View.OnClickListener { private TextView stateText; private Button btn; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); s

android binder 机制二(client和普通server)

在讲它们之间的通信之前,我们先以MediaServer为例看看普通Server进程都在干些什么. int main() { -- // 获得ProcessState实例 sp<ProcessState> proc(ProcessState::self()); // 得到ServiceManager的Binder客户端实例 sp<IServiceManager> sm = defaultServiceManager(); -- // 通过ServiceManager的Binder客户

Handle机制详解

原文地址:http://blog.csdn.net/kakaxi1o1/article/details/12278499 一.Android消息机制一 Android 有一种叫消息队列的说法,这里我们可以这样理解:假如一个隧道就是一个消息队列,那么里面的每一部汽车就是一个一个消息,这里我们先忽略掉超车等种种因素,只那么先进隧道的车将会先出,这个机制跟我们android 的消息机制是一样的. 角色描述 1. Looper:(相当于隧道) 一个线程可以产生一个Looper 对象,由它来管理此线程里的

Android Binder机制分析(5) Binder_ioctl()分析

引言 在博客Android Binder机制(3)本地服务注册过程这篇博客中我们详细讲解了本地服务的注册过程,除了一个地方之外,那就是IPCThreadState::waitForResponse()方法中的talkWithDriver(),而在talkWithDriver()中调用了binder_ioctl(),由于内容太多,所以专门写一篇博客进行分析. 实际上,不只是在服务注册过程中会调用到Binder Driver中的binder_ioctl(),在服务检索.服务使用阶段都会调用到bind