Android Handler详解

Android应用开发经常要进行网络操作,我们可采用AsyncTask和   Thread+Handler机制来实现  ,今天先总结   Thread+Handler  的使用方法,我们将网络操作放在Thread中,开发的时候要注意这一点,因为在Android2.3里面在网速给力的情况下,是不会出现anr异常的,but,在Android4.0往后所有的网络操作都必须放在线程或者异步任务里面,否则汇报一个异常,这个异常不怎么起眼(logcat打印为黄色),初学者经常会犯这个错误,所以我们要养成将网络操作放在线程和异步任务里面。

看代码:

首先我们要创建一个handler的实例,然后覆写其handleMessage()方法,这里方法体的操作为更新界面的操作。

	private Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			mMarkers = new ArrayList<Marker>();
			markerInfos = (List<MarkerInfo>) msg.obj;
			LatLng llA = null;
			OverlayOptions ooA = null;
			for (MarkerInfo markerInfo : markerInfos) {
				llA = new LatLng(markerInfo.getLongtitude(), markerInfo.getLatitude());
				ooA = new MarkerOptions().position(llA).icon(bdA).zIndex(9).draggable(true);
				mMarkers.add((Marker) (mBaiduMap.addOverlay(ooA)));// 将位置添加至地图
			}
		};
	};

耗时操作:

new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					while (FLAG) {
						markerInfos = MarkerService
								.getMarkerInfo(RoutePlanActivity.this, 31.4874500000, 120.3826130000);
						Message msg = handler.obtainMessage();
						msg.obj = markerInfos;
						Thread.sleep(1000);
						handler.sendMessage(msg);
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}).start();

这里使用handler.obtainMessage();方法获取一个Message对象,虽然我们可以直接new 一个Message对象出来,但是handler机制为我们提供了消息池,所以开发时我们应该使用   handler.obtainMessage()方法是从消息池取消息,可以增强应用性能。

handler提供了多个方法来发送消息:

post(Runnable r) //执行一个在主线程的操作
postAtFrontOfQueue(Runnable r) //post一个消息给一个继承自runnable的对象
postAtTime(Runnable r, long uptimeMillis) //在指定的时间

postDelayed(Runnable r, long delayMillis) 

sendEmptyMessage(int what) //发送一个空消息
sendEmptyMessageAtTime(int what, long uptimeMillis) //在制定的时间发送消息
sendEmptyMessageDelayed(int what, long delayMillis)//延迟delayMillis的时间发送空消息 
sendMessage(Message msg) //发送一个普通的消息
sendMessageAtFrontOfQueue(Message msg) //发送一个消息,这个消息位于消息队列的前端
sendMessageAtTime(Message msg, long uptimeMillis) //发送消息在指定的时间
sendMessageDelayed(Message msg, long delayMillis) //延时发送消息

总结:

以post开头的方法有个Runnable参数,这个的意思是在主线程中的操作,切记,一些后台的操作用send开头的方法就不会出现anry异常了。。。。


AsynTask以后再讲吧。




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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值