声明:本博文作为个人的学习笔记,如果有想法我会继续更新,欢迎大家斧正,共同进步。
@http://blog.csdn.net/tt_man
* Handler的使用步骤
* 1 创建Handler对象
* 2 创建子线程完成耗时操作
* 3 耗时操作执行完之后,在子线程中创建Message对象,并将请求的数据封装到Message中
* 4 在子线程中使用Handler将Message对象发送到主线程
* 5 复写Handler的handleMessage方法,接收子线程传递过来的Message对象
* 解析Message对象,并刷新UI
开始撸代码:
private Handler handler = new Handler() {
/**
* 复写Handler的handleMessage方法,接收从子线程中发送的消息Message对象
* 此方法是在主线程中执行
* 解析此Message,获取耗时操作的数据,并刷新UI
* @param msg 就是在子线程调动sendMessage(Message)所传入的Message对象
*/
public void handleMessage(Message msg) {
//Handler 5
byte[] data = (byte[]) msg.obj;
Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);
image.setImageBitmap(bm);
if(pd.isShowing()) {
pd.dismiss();
}
};
};
在主线程中开启子线程,封装数据到Message对象中,发送给目标Handler
new Thread() {
@Override
public void run() {
super.run();
final byte[] data = HttpClientHelper.loadByteFromURL(url);
//Handler 3
/*
* 写法1
*/
//Message msg = new Message();
/*
* 写法2
*/
//Message msg = handler.obtainMessage();
/*
* 写法3
*/
Message msg = Message.obtain();
msg.setTarget(handler); //设置Message的目标发送对象
/*
* 写法4
*/
handler.post(new Runnable() {
@Override
public void run() {
long id = Thread.currentThread().getId();
String name = Thread.currentThread().getName();
android.util.Log.e("danny", "id is " +id + " name is " + name);
Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);
image.setImageBitmap(bm);
if(pd.isShowing()) {
pd.dismiss();
}
}
});
//将byte数组赋值给Message对象中obj变量
msg.obj = data;
//Handler 4
//handler.sendMessage(msg);
//msg.sendToTarget();
}
}.start();
我们声明了四种写法,第四种写法中,我们使用Handler的Post方法开启了一个新的县城,实际该线程反而是跑在主线程上的,所以可以做一些UI操作,
其他三种方法,都要求调用handler.sendMessage(msg)或者msg.sendToTarget();方法。然后handler的handleMessage方法会被回调。
附图一张Handler机制
图中展示了Handler消息处理机制的四大关键组件:
Handler,Message,MessageQueue,Looper
使用Handler机制,配合Timer类可以实现类似于广播牌的广告轮播效果,感兴趣的小伙伴可以试试。