Handler的使用

来源:互联网 发布:js统计按钮点击次数 编辑:程序博客网 时间:2024/06/06 01:58

声明:本博文作为个人的学习笔记,如果有想法我会继续更新,欢迎大家斧正,共同进步。

@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 5byte[] data = (byte[]) msg.obj;Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);image.setImageBitmap(bm);if(pd.isShowing()) {pd.dismiss();}};};
在主线程中开启子线程,封装数据到Message对象中,发送给目标Handler

new Thread() {@Overridepublic 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() {@Overridepublic 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类可以实现类似于广播牌的广告轮播效果,感兴趣的小伙伴可以试试。

0 0
原创粉丝点击