Handler是Android中非常重要的类之一,通过Handler可以实现主线程的延时操作和线程之间的通信,通过在子类中的Handle、和Looper可以很轻松的实现一个请求队列。
在写代码之前首先简要的说一下 Handler、Looper、MessageQuene之间的关系。
每一个线程最多有一个Looper、一个Looper里边含有一个MessageQuene。
Handler每次将消息发送到MessageQuene中,Looper用过一个死循环不断的从MessageQuene中获取消息,获取后,根据Message的target分发给对应的Handler进行处理。
下边是我写的一个通过Handler和Looper实现的请求队列:
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
package
com.hou.looper;
import
android.app.Activity;
import
android.os.Bundle;
import
android.os.Handler;
import
android.os.Looper;
import
android.util.Log;
public
class
DemoLooperActivity
extends
Activity {
private
MyThread myThread =
new
MyThread();
/** Called when the activity is first created. */
@Override
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.main);
/*********** 模拟两个任务 ***********/
postToNoneUIThread(
new
Runnable() {
@Override
public
void
run() {
try
{
Log.e(
""
,
"5 start"
);
Thread.sleep(
5000
);
Log.e(
""
,
"5 end"
);
}
catch
(InterruptedException e) {
e.printStackTrace();
}
}
});
postToNoneUIThread(
new
Runnable() {
@Override
public
void
run() {
try
{
Log.e(
""
,
"1 start"
);
Thread.sleep(
1000
);
Log.e(
""
,
"1 end"
);
}
catch
(InterruptedException e) {
e.printStackTrace();
}
}
});
/*********** 模拟两个任务OVER ***********/
}
public
void
runOnNoneUIThread(Runnable r) {
new
Thread(r).start();
}
/**
* 放入到子线程队列中
* */
public
void
postToNoneUIThread(Runnable r) {
// 执行到这里的时候,子线程可能尚未启动,等待子线程启动,等待的时间会很短,
while
(myThread.handler ==
null
) {
}
myThread.handler.post(r);
myThread.handler.sendEmptyMessage(
100
);
}
/**
* 可以设计为网络请求队列
* */
class
MyThread
extends
Thread {
{
start();
// 类加载完成后直接启动
}
private
Handler handler;
@Override
public
void
run() {
while
(
true
) {
Looper.prepare();
// 创建该线程的Looper对象
handler =
new
Handler(Looper.myLooper()) {
public
void
handleMessage(android.os.Message msg) {
Log.i(
"handleMessage"
,
""
+ msg.what);
};
};
Looper.loop();
// 这里是一个死循环
// 此后的代码无法执行
}
}
}
}
|
转自:http://www.cnblogs.com/ihou/archive/2012/08/28/2660655.html