一、简述
> 最近因为一直在准备比赛,做Android端与物联网平台的交互处理,就没怎么去接触一些比较新的技术,记录一个遇到的小Demo,主要用于处理延时操作,本例使用两个Handler和两个Timer。
二、Handler
作用:
主要接受子线程发送的数据, 并用此数据配合主线程更新UI(虽然这个Demo没有使用任何页面控件)。
接收与处理消息:
1
2
3
4
5
6
7
8
9
10
11// 创建一个Handler
private final Handler handlerA = new Handler() {
// 处理Loop队列中的消息
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
... ...
break;
}
}
};发送消息:
1
2
3
4
5
6Message message = new Message();
message.what = 1;
message.obj = bm;
handlerA.sendMessage(message);
// handlerA.sendEmptyMessage(2);通过弱引用创建Handler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19// 弱引用
Handler handler = new MyHandler(MainActivity.this);
... ...
static class MyHandler extends Handler {
WeakReference<Activity> mActivityReference;
MyHandler(Activity activity) {
mActivityReference = new WeakReference<Activity>(activity);
}
public void handleMessage(Message msg) {
final Activity activity = mActivityReference.get();
super.handleMessage(msg);
}
}关闭Activity时停止后台线程
1
2
3
4
5
6
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
mHandler.removeCallbacksAndMessages(null);
}Handler延时
1
2
3
4
5
6
7// 延时5s发送数据
new Handler().postDelayed(new Runnable() {
public void run() {
handlerA.sendEmptyMessage(3);
}
}, 5000);
三、Timer
代码段一:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18// 延时1000ms执行TimerTask
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
Log.e("test", "这是来自计时器的第一条消息");
try {
// 休眠1000ms
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.e("test", "这是来自计时器的第二条消息");
}
}, 1000);代码段二:
1
2
3
4
5
6
7
8
9
10
11
12
13
14Timer timer = new Timer();
// 延时循环(延时1000ms调用一次task,每2000ms一次)
//task:TimerTask、1000: 延时多久执行、2000:每隔多长时间执行一次
timer.schedule(task, 1000, 2000);
... ...
TimerTask task = new TimerTask() {
public void run() {
handlerB.sendEmptyMessage(0x01);
}
};