Handler的使用

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值