android handle消息,Android Handle 消息机制

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

handle 消息机制是Android 重要的组成部分,首先我们需要的理解的是Android为什么需要 handle 机制。开发Android的都得知道 Android有主线程之分(UI 线程),主线程中每16ms接收到Android系统的同步信号来更新UI 视图。如果在主线程中进行耗时操作会阻塞线性会造成ANR(无响应异常)。如果在子线程中进行耗时操作,当子线程任务完成时,无法直接调用主线程中UI 组件(主线程不是线程安全的,子线直接调用主线程中的UI 组件会产生不可预期的错误,如死锁等,如果给主线程加锁会造成UI 组件的复杂性并且阻塞了部分操作的执行)。基于以上的理由Android 设计了Handle 机制来确保当子线程执行完耗时操作时能够安全的更新主线程中的UI 视图(也可以确保不同线程之间的安全通信)。到这里我们能够理解 handle 机制 机制存在的理由了,下面我们继续组成、使用及原理。

9427f2b1ce079fa8fdd8b4691014375f.png

如上图,Handle 中有三个重要的组成部分:handle,Loop,MessageQueue。

Handle

在Handle主要承担着发送Message 到 MessageQueue队列中和和接收处理 Loop 分发过来的 Message。

如下代码1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26public class{

Handler mHandler;

public static final int HANDLE_WHAT_1 = 10;

public void (){

mHandler = new Handler(Looper.getMainLooper()) {

public void handleMessage(Message message){

switch (message.what) {

case HANDLE_WHAT_1:

break;

default:

break;

}

}

};

Message message = new Message();

message.what = HANDLE_WHAT_1;

message.arg1 = 1;

message.arg2 = 2;

message.obj = "handle test";

// 发送 消息

mHandler.sendMessage(message);

}

}

在源代码中 handle 通过 send***方法调用MessageQueue的queue.enqueueMessage向 MessageQueue插入一条Message1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20// 源码 Handler.java

public final boolean sendMessageAtFrontOfQueue(Message msg){

MessageQueue queue = mQueue;

if (queue == null) {

RuntimeException e = new RuntimeException(

this + " sendMessageAtTime() called with no mQueue");

Log.w("Looper", e.getMessage(), e);

return false;

}

return enqueueMessage(queue, msg, 0);

}

private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis){

msg.target = this;

if (mAsynchronous) {

msg.setAsynchronous(true);

}

return queue.enqueueMessage(msg, uptimeMillis);

}

在Loop调用 MessageQueue中的 getNextMessage 方法 获取 Message的handle 引用 通过 dispatchMessage分发Handle 中处理。1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16// 源码

while (SystemClock.uptimeMillis() < end) {

boolean conditionsMet = true;

// 省略部分代码

if (conditionsMet) {

QueueState queueState = queueInterrogator.determineQueueState();

if (queueState == QueueState.EMPTY || queueState == QueueState.TASK_DUE_LONG) {

return;

}

}

Message message = queueInterrogator.getNextMessage();

message.getTarget().dispatchMessage(message);

recycler.recycle(message);

loopCount++;

}

MessageQueue

单链表结构,主要用于存储 Message, 插入方法enqueueMessage,出队方法 next ,

Loop

Loop 主要是一个循环器,它不断的循环 MessageQueue 队列并取出 Message 交个 Handle处理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值