Handler 实现异步操作, 注意:不能异步更新UI

//异步加载Ad数据
		HandlerThread handlerThared = new HandlerThread("new Thread");
		handlerThared.start();//开启一个新的线程,脱离UI(主)线程
		final Handler handler = new Handler(handlerThared.getLooper()){
			/**
			 *  覆盖Handler中的handlleMessage方法
			 *  异步
			 */
			@Override
			public void handleMessage(Message msg) {
//				Result result = (Result) msg.obj;
//				@SuppressWarnings("unchecked")
//				List<Product> productList = (List<Product>) result.getResultList();
//				int index = 0;
//				for(Product p : productList){
//					View ad = thiz.createAdView(p, index);
//					//为每张AD图片添加TouchEvent
//					ad.setOnTouchListener(thiz);
//					thiz.adFlipper.addView(ad, index);
//					index++;
//				}
		    }
		};
		handler.postDelayed(new Runnable() {
			@Override
			public void run() {//
				//查询推荐商品
				Result result = XmlCrawler.queryTjProduct(1, 10);
				if(result != null){
					Message msg = handler.obtainMessage();
					msg.obj = result;
					//利用handler通过msg传递参数
					handler.sendMessage(msg);
				}
			}
		},1000 * 0);


 解析:

HandlerThread handlerThared = new HandlerThread("new Thread");
		handlerThared.start();//开启一个新的线程,脱离UI(主)线程
		final Handler handler = new Handler(handlerThared.getLooper()){


1:如果想让handler异步, 必须使用HandlerThread 新开启一个线程

2:handleMessage 中可以做一些异步操作,但是不能异步更新UI

否则将会报异常: Only the original thread that created a view hierarchy can touch its views.

创建只有创建它的线程才可以touch它、 也就是 UIThread

因为创建handler时候指定的参数 handlerThared.getLooper()   注定了,  handler 与主线程 是两个不同的线程

3:如果参数指定为 handlerThared.getLooper() .getMainLooper() 则不能实现异步功能, 仍然是同一个线程

 

以上描述, 是我通过代码得出的结论 , 不一样正确

看到这篇文章的博友们。 仅供参考

如果想实现真正意义上的异步更新UI , 还是用AsyncTask吧 这个方便

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值