Handle
是 Android 消息机制的上层接口,多用于更新 UI ,也可以做其他耗时操作比如网络。
Handler
创建的时候会采用当前的线程 Looper
来构造消息循环系统。说道 Looper 要说道 ThreadLocal
-
主要作用:
Handler
是将一个任务切换到某个指定的线程中去执行。 -
ThreadLocal: 并不是线程,作用是可以在每个线程中存储数据。可以在不同的线程中互不干扰地提供数据。通过
ThreadLoacl
可以获得每个线程的Looper
- MessageQueue:作用是在每个线程存储消息的单元
Handler 工作流程
Handler 创建完毕后,这个时候内部的 Looper 以及 MessageQueue 就可以和 Handler 一起协同工作了。
- Handler 通过
post/send
方法将一个Runnable
投递到Handler
内部的Looper
处理。其实 post 方法最终也是通过 send 方法完成的。 -
send 过程:它会调用
MessageQueue
的enqueueMessage
方法将这个消息放入消息队列中,然后Looper
发现有新消息到来时,就会处理这个消息,最终消息中Runnable
或者Handler
的handleMessage
方法被调用。Looper
是运行创建Handler
所在的线程中。
ThreadLocal 的工作原理
ThreadLocal 是一个线程内部的数据存储类,通过它可以在指定的线程中存储数据, 其他线程无法访问。
-
Handler
它需要获取当前线程的Looper
,Looper
的作用域就是线程并且不同线程具有不同的Looper
,通过ThreadLocal
可以获取本线程的Looper
Looper 的工作原理
Looper 具体实现,Looper 在Android 中扮演着消息循环的角色,具体它会不停地从 MessageQueue 中查看是否有新消息,如果有新消息就会立刻处理,否则会阻塞。
-
Looper
会在构造方法中创建一个MessageQueue
。 -
Looper
提供了quit
和quitSafely
来退出一个Looper
,在子线程中建议在不需要的时候停止 Looper。
Hanlder 的工作原理
Handler 的工作主要包含消息的发送和接收过程。消息的发送可以通过 post
的一系列方法以及 send
一系列方法实现,post
的一系列方法最终是通过 send
的一些列方法来实现的。
-
发送消息:
Handler
发送消息的过程仅仅是向消息队列插入一条消息,MessageQueue
的 next 方法就会返回这条消息给 Looper,Looper 收到消息后就开始处理了,最终消息由 Looper 交由 Handler 处理,即Handler
的dispatchMessage
方法被调用,Handler进入消息处理阶段。 -
处理消息:
(1) post 方法传递的Runnable
对象处理
(2)mCallback
对象处理,Callback 是个接口,通过 Handler handler = new Handler(callback); 创建的 Handler 对象(日常开发,创建 Handler 对象的方式是派生一个 Handler 子类并重写其 Handler 方式),不想用子类可以使用 Callback 来实现。 - 最后调用,
Handler
的handlerMessage
方式来处理消息。
网友评论