android handle原理,Android 回顾 --(二十) Handle,Looper 的工作原理和源码分析

Android 回顾 --(二十) Handle,Looper 的工作原理和源码分析

一, Handle 原理图

ab7653affab982b574eb7acc55df2e04.gif

handle 流程图. PNG

通过上面绘制的流程图, 我们其实可以知道 handle 理解起来不是很难. 下面具体讲解一下使用流程

二, Handler,Message,MessageQueue,Looper 方法及属性

Handler.java:(3 个属性, 10 个方法)

3 个属性:

final MessageQueue mQueue; 封装好的消息被 handler 发送出去, 其实就是将消息放到消息队列中去

final Looper mLooper; 每一个 handler 都有一个 looper 为其不断接收消息队列中的消息, 并返回给 handler.

final Callback mCallback; 被 handler 接收到的消息要通过 Callback 接口中的 handleMessage() 方法来进行处理.

10 个方法:

public boolean handleMessage(Message msg); Callback 接口中的 handleMessage() 方法, 用来处理返回给 handler 的消息的.

public final Message obtainMessage(); 获取 Message 对象, 其本质还是调用 Message 类的 obtain() 方法来获取消息对象.

public final boolean sendMessage(Message msg) 发送消息

public final boolean sendEmptyMessage(int what) 发送只有 what 属性的消息, 就是发送空白消息

public final boolean post(Runnable r) 发送消息

public final boolean postAtTime(Runnable r, long uptimeMillis) 定时发送消息

public final boolean postDelayed(Runnable r, long delayMillis) 延迟发送消息

public void dispatchMessage(Message msg) 分发消息, 当 Looper 循环接收消息队列中的消息时, 就在不断调用 handler 的分发消息方法, 从而触发 Callback 接口中的消息处理方法 handleMessage() 来对消息进行处理.

public final boolean sendMessageDelayed(Message msg, long delayMillis) sendMessage() 就是在调用延时发送消息的方法.

public boolean sendMessageAtTime(Message msg, long uptimeMillis) 延时发送消息的方法就是在调用定时发送消息的方法.

private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) 将消息压入消息队列中

MessageQueue.JAVA:(2 个方法)

final boolean enqueueMessage(Message msg, long when) handler 发送的消息正是通过该方法被加进了消息队列中. 因为消息队列中有消息, 从而触发了 Looper 通过 loop() 方法循环接收所有的消息.finalMessagenext();

Looper.JAVA:(1个属性,5个方法)

3 个属性

static final ThreadLocal sThreadLocal = new ThreadLocal(); 正是由于该线程本地变量, 保证了一个线程中只能保存一个 Looper 对象, 也就是说一个 Thread 中只能有一个 Looper 对象.

5 个方法:

public static void prepare() 每个 handler 所在的线程都必须有一个 Looper 提前准备好.

public static void prepareMainLooper() 主线程中的的 Looper 已经被自动准备好. 而该方法不需要手工调用.

public static Looper getMainLooper() 获取主线程中的 Looper 对象

public static void loop() Looper 的作用就是循环接收消息队列中的消息. 该方法中执行了一个无限循环.

public static Looper myLooper() 该方法的作用是从线程本地变量中获取到当前线程的 Looper 对象.

Message.java:(10 个属性, 7 个方法)

10 个属性:

public int what; 该属性一般用来标识消息执行的状态.

public int arg1; 用来存放整型数据的属性.

public int arg2; 用来存放整型数据的属性.

public Object obj; 用来存放复杂消息数据的属性.

Bundle data; 用来存放复杂消息数据的属性.

Handler target; 标识该消息要被发送给哪个 Handler 对象.

Message sPool; 消息池中的每个消息对象.

int sPoolSize; 记录消息池中剩余消息的数量.

int MAX_POOL_SIZE=50; 消息池中最大消息数量.

Messenger replyTo; 定义消息的信使对象, 将来可以用于跨 App 的消息传递.

7 个方法:

public static Message obtain() 从消息池中获取消息对象.

public void recycle() 往消息池中归还消息对象.

public void setTarget(Handler target) 给消息设置接收该消息的目标 handler 对象.

public Handler getTarget() 获取消息的接收 handler 对象.

public void sendToTarget() 将消息发送到目标 handler 对象. 其本质是调用 handler 对象的 sendMessage() 方法来发送当前消息对象.

public void setData(Bundle data) 将 Bundle 对象设置到 message 对象中 Bundle 属性中.

public Bundle getData() 从消息对象中获取 Bundle 属性的数据.

消息传递机制中各方法之间的执行顺序

ab7653affab982b574eb7acc55df2e04.gif

消息传递顺序. PNG

结语

对于 handler 其实没有大家想象的那么难, 在平时的工作中, 我们使用的时候非常多, 经常使用就会有不一样的理解. 最后, 欢迎大家点赞和提问哦!

来源: http://www.jianshu.com/p/df3710bb19f6

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值