-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLooper.java
More file actions
50 lines (40 loc) · 1.36 KB
/
Copy pathLooper.java
File metadata and controls
50 lines (40 loc) · 1.36 KB
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/**
* 消息泵,负责取出消息交给Handler来处理。
*/
public class Looper {
static ThreadLocal<Looper> messageThreadLocal = new ThreadLocal<>();
MessageQueue messageQueue;
private Looper() {
messageQueue = new MessageQueue();
}
/**
* 获取Looper的线程副本
*
* @return 返回Looper线程副本
*/
public static Looper getLocalLooper() {
// 返回此线程局部变量的当前线程副本中的值,如果这是线程第一次调用该方法,则创建并初始化此副本。
return messageThreadLocal.get();
}
public static void prepare() {
if (messageThreadLocal.get() != null) {
throw new RuntimeException("Only one Looper may be created per thread");
}
messageThreadLocal.set(new Looper());
}
public static void loop() {
Looper looper = getLocalLooper();
if (looper == null) {
throw new RuntimeException("No Looper; Looper.prepare() wasn't called on this thread.");
}
MessageQueue messageQueue = looper.messageQueue;
// 无限循环
for (; ; ) {
Message message = messageQueue.consumeMessage();
if (message == null || message.handler == null) {
continue;
}
message.handler.dispatchMessage(message);
}
}
}