8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
handle 消息机制是Android 重要的组成部分,首先我们需要的理解的是Android为什么需要 handle 机制。开发Android的都得知道 Android有主线程之分(UI 线程),主线程中每16ms接收到Android系统的同步信号来更新UI 视图。如果在主线程中进行耗时操作会阻塞线性会造成ANR(无响应异常)。如果在子线程中进行耗时操作,当子线程任务完成时,无法直接调用主线程中UI 组件(主线程不是线程安全的,子线直接调用主线程中的UI 组件会产生不可预期的错误,如死锁等,如果给主线程加锁会造成UI 组件的复杂性并且阻塞了部分操作的执行)。基于以上的理由Android 设计了Handle 机制来确保当子线程执行完耗时操作时能够安全的更新主线程中的UI 视图(也可以确保不同线程之间的安全通信)。到这里我们能够理解 handle 机制 机制存在的理由了,下面我们继续组成、使用及原理。
如上图,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处理。