Handler、Looper、HandleThread、ActivityThread简介

1. Handler

        源码位于: platform/frameworks/base/core/java/android/os/Handler.java

        Handler允许发送和处理与线程的MessageQueue关联的Message和Runnable对象。每个Handler实例都与单个线程和该线程的消息队列相关联。

        当创建一个新的Handler时,它会被绑定到一个Looper上。Handler将会把Message和Runnable对象传递到Looper的消息队列上,并在Looper线程上执行它们。

        Handler有两个主要用途:

                (1) 调度Message和Runnable在未来的某个时间点执行;

                (2) 在不同的线程上执行的操作;

private Handler mHandler = new Handler() {
	@Override
	public void handleMessage(@NonNull Message msg) {
		super.handleMessage(msg);
	}
};
Handler、Looper、HandleThread、ActivityThread简介_第1张图片 使用默认Looper的Handler

Handler、Looper、HandleThread、ActivityThread简介_第2张图片 用户显式指定Handler的Looper
Handler、Looper、HandleThread、ActivityThread简介_第3张图片 Handler发送消息流程

2. Looper

        源码位于:platform/frameworks/base/core/java/android/os/Looper.java

        用于为线程运行消息循环的类。默认情况下,线程没有与之关联的消息循环。创建一个Looper,需要在运行Looper的线程中调用prepare()方法,然后让Looper处理消息(Looper.loop()),直到Looper停止。

class LooperThread extends Thread {
	public Handler mHandler;

	public void run() {
		Looper.prepare();
		mHandler = new Handler(Looper.myLooper()) {
			public void handleMessage(Message msg) {
				// process incoming messages here
			}
		};

		Looper.loop();
	}
}
Handler、Looper、HandleThread、ActivityThread简介_第4张图片 Looper.prepare()相关流程

Handler、Looper、HandleThread、ActivityThread简介_第5张图片 Looper.loop()相关流程

Handler、Looper、HandleThread、ActivityThread简介_第6张图片 ThreadLocal类

3. Message流转图

Message流转示意图

        从上图中可以看出,handlemessage是位于调用栈中处理业务逻辑。因此,如在UI主线程处理操作比较耗时,会产生ANR。 

 4. HandlerThread

        源码位于: platform/frameworks/base/core/java/android/os/HandlerThread.java

public class HandlerThread extends Thread

        自带 Looper 的线程。 Looper 然后可以用于创建Handler处理程序。请注意,就像使用常规线程一样,仍然必须调用Thread.start()

        在用HandlerThread类创建出的对象,一般不实现run()方法,因为HandlerThread类中已经封装好run()方法。

Handler、Looper、HandleThread、ActivityThread简介_第7张图片 HandlerThread类

 5. ActivityThread     

        源码位于:platform/frameworks/base/core/java/android/app/ActivityThread.java

public final class ActivityThread extends ClientTransactionHandler;

        ActivityThread,从名称上看它是Activity所属的线程,也就是大家熟悉的UI主线程(因为只有主线程才能处理UI相关的事务,包括UI界面更新)。

Handler、Looper、HandleThread、ActivityThread简介_第8张图片 简易Activity的stack调用图

         主线程与普通线程处理消息的机制很相似。普通线程只要prepare就可以了,而主线程使用的是prepareMainLooper。

        普通线程生成一个与Looper绑定的Handler对象,而主线程是从当前线程中获取的Handler(thread.getHandler())

Handler、Looper、HandleThread、ActivityThread简介_第9张图片 ActivityThread流程图

你可能感兴趣的:(深入理解AndroidⅠ和Ⅱ,android)